Java协方差

Java协方差,java,covariance,Java,Covariance,我很难找到答案。假设我有以下代码: 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> mamma

我很难找到答案。假设我有以下代码:

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
}
为什么赋值会导致编译错误?该错误类似于:

类型不匹配:无法从列表转换为列表 根据我对协方差的理解,get哺乳类方法返回一个始终包含哺乳类对象的列表,因此它应该是可分配的。我遗漏了什么?

因为get哺乳类动物可以返回一个列表,如果该列表可以转换为列表,那么您就可以向其中添加斑马。你不能在长颈鹿名单上加斑马,是吗

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

不幸的是,它不是那样工作的


当您声明要返回List+1时,您能解释一下List或List but not List的含义吗预格式化以删除令人困惑的“列表或列表但不是列表”:-泛型被视为html,escapedI不理解此答案-OP不想将其视为列表。
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;}
}