Java Generic超级关键字

时间:2015-03-24 00:42:53

标签: generics super

我有以下程序:

public void performGenerics() {
      List<? super Animal> testAnimal = new ArrayList<Animal>();
        testAnimal.add(new Dog());
    }

在上面的代码中,Animal是Dog的超级类。我的问题是,超级意思是,它应该只接受Animal或Object类。虽然Dog是Animal的子类,但为什么要在testAnimal集合中添加狗呢?我很困惑。有人可以告诉我吗?

2 个答案:

答案 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())。

这意味着您可以使用相同的动物比较器创建一组有序的动物,一组排序的犬类或一组排序的狗。