关于java:为什么列出< SuperClassType>

Why List<SuperClassType> newList = new ArrayList<SubClassType>() violates type safety?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Is `List` a subclass of `List`? Why aren’t Java’s generics implicitly polymorphic?

我已经宣布这些课程:

1
class Cereal{}

还有:

1
2
3
4
5
public class Flakes extends Cereal{
    public static void main(String[] args) {
       List<Cereal> newList = new ArrayList<Flakes>();
    }
}

但是,当我试图编译这些Java源代码时,出现了编译错误:

1
Type mismatch: cannot convert from ArrayList<Flakes> to List<Cereal>

我的问题是:为什么不可能转换?是否违反了类型安全规则?还是?

提前感谢您的回复。


一句话:Polymorphism不适用于generic type arguments

但是你可以用野猫给谷类食品上界。

1
List<? extends Cereal> list = new Arraylist<Flakes>();

现在这个列表接受任何谷物,但是记住你不能添加除空以外的任何东西。

1
List<? super Flakes> list = new ArrayList<Cereal>();

此列表接受任何薄片和超级类型薄片。即。。一个谷类食品和一个java.lang.object。


因为除非定义,否则类型是刚性的。您要尝试以下操作:

1
     List<? extends Cereal> newList = new ArrayList<Flakes>();

这意味着它的列表对象扩展了Cereal,因此上面的语句就有效了。


1
2
3
   ArrayList<Flakes> newList = new ArrayList<Flakes>();
   ArrayList<Cereal> moreGeneralList = newList;
   moreGeneralList.add(new NonFlakeCereal());

newList.get(0)是什么类型的?它应该是Cereal,而不是Flakes。然而,newListget应该返回Flakes