我有以下程序:
public void performGenerics() {
List<? super Animal> testAnimal = new ArrayList<Animal>();
testAnimal.add(new Dog());
}
在上面的代码中,Animal是Dog的超级类。我的问题是,超级意思是,它应该只接受Animal或Object类。虽然Dog是Animal的子类,但为什么要在testAnimal集合中添加狗呢?我很困惑。有人可以告诉我吗?
答案 0 :(得分:0)
它的确切含义是:
// This is a list of "something" whose superclass is definitely an animal
List<? super Animal> testAnimal = new ArrayList<Animal>();
这有点毫无意义。最好写
// My list contains animals and any subclasses of them
// the new object gets its specialisation from the declaration of the
// type on the left (Java 7 onwards)
List<Animal> listOfAnimals = new ArrayList<>();
如果您希望列表接受对象和动物,那么也许您不应该使用泛型...或者您可能不想在一个列表中混合对象和动物
答案 1 :(得分:0)
实际上,变量List< ? super Animal >
是一些未知元素类型A
的列表,其中是Animal
的超类。因此,你可以做任何只需要做出这个假设的事情。
接受类型A
的参数的类的方法,例如add()
,可以采用类型为A
的任何参数或任何子类它。 Dog
作为Animal
的子类,因此也必须是A
的子类。
返回类型A
的方法,例如get()
,是非常无用的,因为我们对A
唯一了解的是它是超类Animal
。
那你为什么要用这种结构?
好吧,你不会像现在那样使用它。相反,请考虑SortedSet< T >
的示例。您可以为其中一个构造函数提供Comparator< ? super T >
,因为使用的比较器的唯一方法是接受器方法(compare()
)。
这意味着您可以使用相同的动物比较器创建一组有序的动物,一组排序的犬类或一组排序的狗。