Java协方差

我正在努力解决这个问题。 说我有以下代码:

class Animal { } class Mammal extends Animal { } class Giraffe extends Mammal { } ... public static List getMammals() { return ...; } ... public static void main(String[] args) { List mammals = getMammals(); // compilation error } 

为什么赋值会导致编译错误? 错误是这样的:

 Type mismatch: cannot convert from List to List 

根据我对协方差的理解, getMammals()方法返回一个总是包含Mammal对象的list ,因此它应该是可赋值的。 我错过了什么?

因为getMammals可以返回List ,如果它可以转换为List那么你就可以向它添加一个Zebra 。 你不能被允许将Zebra添加到Giraffe列表中,对吗?

 class Zebra extends Mammal { } List giraffes = new List(); List mammals = giraffes; // not allowed mammals.add(new Zebra()); // would add a Zebra to a list of Giraffes 

好吧,不幸的是,它并不像那样。

当你声明getMammals()返回List List它意味着它可以返回ListList但不能返回List

你的main()应该是这样的:

 public static void main(String[] args) { List mammals = getMammals(); Mammal mammal = mammals.get(0); } 

编辑:关于协方差,这通常意味着:

 class Animal { public Animal getAnimal() {return this;} } class Mammal extends Animal { public Mammal getAnimal() {return this;} } class Giraffe extends Mammal { public Giraffe getAnimal() {return this;} } 

正如您所看到的,它允许在重写方法时重载返回类型的方法。