题
我有一个困难时期试图弄清楚这一点。说我有以下代码:
class Animal { }
class Mammal extends Animal { }
class Giraffe extends Mammal { }
...
public static List<? extends Mammal> getMammals() { return ...; }
...
public static void main(String[] args) {
List<Mammal> mammals = getMammals(); // compilation error
}
为什么分配导致编译错误?该错误是这样的:
Type mismatch: cannot convert from List<capture#4-of ? extends Mammal> to List<Mammal>
根据我的协方差的理解,getMammals()
方法返回一个list
将始终包含Mammal
对象,所以它应该是分配。我缺少什么?
解决方案
由于getMammals
可以返回List<Giraffe>
,如果这是可转换到List<Mammal>
那么你可以到Zebra
添加到它。你不能被允许的Zebra
添加到Giraffe
的列表,你行吗?
class Zebra extends Mammal { }
List<Giraffe> giraffes = new List<Giraffe>();
List<Mammal> mammals = giraffes; // not allowed
mammals.add(new Zebra()); // would add a Zebra to a list of Giraffes
其他提示
好了,这是行不通的那样的不幸。
在声明getMammals()返回List<? extends Mammal>
这意味着它可以返回List<Mammal>
或List<Giraffe>
但不List<Animal>
此致主()应该是这样的:
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;}
}
正如你可以看到它允许过载的方法返回类型时,重写方法。
不隶属于 StackOverflow