List 列表<动物>的子类列表?为什么’t Java’的泛型隐含多态?

问题:

我有点困惑,如何Java泛型处理继承/多态。
假设以下层次结构 –
 动物(父母)
 (儿童)
所以假设我有一个方法doSomething(List<Animal> animals)。通过所有的继承和多态性规则,我假定List<Dog> is a List<Animal>List<Cat> is a List<Animal> – 所以任何一个都可以传递给这个方法。不是这样如果我想实现这个行为,我必须明确地告诉该方法,通过说doSomething(List<? extends Animal> animals)来接受Animal的任何子集列表。
我明白这是Java的行为。我的问题是why?为什么多态性一般是隐含的,但是当涉及到泛型时,它必须被指定?

回答:

不,List<Dog>not a List<Animal>。考虑你可以用List<Animal>做什么 – 你可以添加any动物,包括一只猫。现在,你能不能在一只小狗身上加一只猫?绝对不。

// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?

突然你有一个very困惑的猫。
现在,您can’tCat添加到List<? extends Animal>,因为您不知道是List<Cat>。您可以检索一个值,并知道它将是一个Animal,但是您不能添加任意动物。 List<? super Animal>是相反的 – 在这种情况下,您可以安全地添加一个Animal,但是您不知道可以从中检索什么,因为它可能是一个List<Object>

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Is List a subclass of List? Why aren’t Java’s generics implicitly polymorphic?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

18 − 12 =