我有一个困难时期试图弄清楚这一点。说我有以下代码:

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;}
}

正如你可以看到它允许过载的方法返回类型时,重写方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top