我正在努力解决这个问题.说我有以下代码:
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
}
Run Code Online (Sandbox Code Playgroud)
为什么赋值会导致编译错误?错误是这样的:
Type mismatch: cannot convert from List<capture#4-of ? extends Mammal> to List<Mammal>
Run Code Online (Sandbox Code Playgroud)
根据我对协方差的理解,该getMammals()方法返回一个list始终包含Mammal对象的方法,因此它应该是可分配的.我错过了什么?
Dan*_*ker 19
因为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
Run Code Online (Sandbox Code Playgroud)
好吧,不幸的是,它并不像那样.
当你声明getMammals()返回List<? extends Mammal>它意味着它可以返回List<Mammal>或List<Giraffe>不返回List<Animal>
你的main()应该是这样的:
public static void main(String[] args) {
List<? extends Mammal> mammals = getMammals();
Mammal mammal = mammals.get(0);
}
Run Code Online (Sandbox Code Playgroud)
编辑:关于协方差,这通常意味着:
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;}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它允许在重写方法时重载返回类型的方法.