0

可能重复:
`List<Dog>` 是 `List<Animal>` 的子类吗?为什么 Java 的泛型不是隐式多态的?

我已经声明了这些类:

class Cereal{}

和:

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

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

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

我的问题是:为什么不可能进行这种转换?是否违反了类型安全规则?或者?

提前感谢您的回复。

4

3 回答 3

2

因为类型是刚性的,除非定义。您想在下面尝试:

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

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

于 2012-12-13T21:23:28.940 回答
2

一句话: Polymorphism不适用generic type arguments

但是您可以使用将 Cereal 作为上限的通配符。

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

现在这个列表接受任何是谷物的东西,但请记住,除了 null 之外,您不能添加任何东西。

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

这个列表接受任何是 Flakes 和超类型 Flakes 的东西。IE。一个谷物和一个 java.lang.Object。

于 2012-12-13T21:25:13.847 回答
0
   ArrayList<Flakes> newList = new ArrayList<Flakes>();
   ArrayList<Cereal> moreGeneralList = newList;
   moreGeneralList.add(new NonFlakeCereal());

是什么类型的newList.get(0)?会Cereal但不是Flakes。Yet newList'sget应该会回来的Flakes

于 2012-12-13T21:23:55.640 回答