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 extends Mammal>
List extends Mammal>
它意味着它可以返回List
或List
但不能返回List
你的main()应该是这样的:
public static void main(String[] args) { List extends Mammal> 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;} }
正如您所看到的,它允许在重写方法时重载返回类型的方法。