我有类足球扩展运动,然后创建列表,其中保存上述类的对象.It是以下面的方式完成
Class structure : class Football <T extends Sports> {}
STATEMENT : Collection <Football<? extends Sport>> list = New ArrayList<>();
上面这行到底是什么意思。为什么是“?”在statement.Can中,请将上面的陈述拆分并解释清楚
发布于 2018-08-07 05:50:45
你所做的并不是很有意义。你真的想要一个泛型的类Football吗?也就是说,你可以这样做:
class AmericanFootball extends Sports {
}
class Soccer extends Sports {
}
class Football<T extends Sports> {
}
Football<AmericanFootball> anAmericanFootball;
Football<Soccer> aSoccerBall;
是不是真的想要你的意思:
或者你应该拥有:
class Football extends Sports {
}
你可能指的是美式足球(如果你住在美国)或足球(如果你住在世界其他地方)。你的对象是不是真的在谈论一个圆球或者,嗯,形状像美式足球的球?或者你的班级应该代表足球运动?
假设你的意思是:
类Football扩展了运动{}
Collection<Football> myCollection = new ArrayList<Football>();
Football ballOne = new Football();
Football ballTwo = new Football();
myCollection.add(ballOne);
myCollection.add(ballTwo);
现在,试着回答你真正的问题:
Collection<? extends Sports>
让我们从更简单的开始。您可以这样定义:
Collection<?> foo;
这意味着foo包含未知类型的对象。如果你要接收一个不同对象的集合,这是你可以做的事情。在没有测试的情况下,我相信你实际上可以以这种方式接收任何集合,但如果你这样指定它:
Collection<Object> foo;
那么你只能从字面上把它赋值给一个对象集合,而不是任何集合。无论如何,当泛型第一次让你指定所包含的内容时,人们会做收集,他们的代码是草率的。这是一个坏习惯,但值得理解。
不管怎么说,我试着这样做只是为了确保我没有错:
import java.util.Collection;
import java.util.ArrayList;
class Foo {
public void blah() {
Collection<? extends Foo> array = new ArrayList<Foo>();
Collection<? extends Foo> badArray = new ArrayList<Object>();
}
};
java喜欢第一行ArrayList代码,不喜欢第二行代码。原因是Foo满足,而Object不满足。
所以..。为了回答真正的问题,意味着它可以接受定义为foo的集合或Foo的任何子类的集合的任何集合类。
这意味着它可以拿ArrayList、ArrayList或ArrayList,但不能拿ArrayList,因为唱歌可能不是体育的子类。
发布于 2018-08-07 01:17:11
第一行定义了Football
类,该类可以接受来自扩展Sport
类的任何类的参数,也可以接受Sports
类本身的参数。
class Football <T extends Sports> {}
上面是泛型类型的声明,带有参数部分( <>)。
下一行是创建一个Football
类的Collection
,它可以包含任何Football
类,每个类都有一个扩展Sport
类或Sports
类的任何类型的参数。
https://stackoverflow.com/questions/51712376
复制相似问题