ArrayList不兼容类型

时间:2017-11-30 10:16:09

标签: java arraylist

在我的项目中,我有一些这样的课程:

class A
class B extends A
class C extends A

现在,在我的Main课程中,我有一个ArrayList,如下所示:

ArrayList<A> list

现在当我想用B或C类型的元素实例化它时,我可以这样做:

list = new ArrayList<>(Arrays.asList(b1, b2, c1, c2));

但是当我想在这里只添加C或B类的类型时:

list = new ArrayList<>(Arrays.asList(c1, c2, c3));

IntelliJ抱怨ArrayList incompatibile types但是当我添加A这样的类型时: list = new ArrayList<A>(Arrays.asList(c1, c2, c3));

一切都好。那是为什么?

1 个答案:

答案 0 :(得分:2)

自Java7 Oracle引入钻石运算符以来。此运算符使用reflextion从参数或返回值中确定类型。在您总是必须将类型填入泛型类之前。

问题在于,在另一个中有一个泛型类,对于der内部泛型方法Arrays.asList()混合参数类型,并且还没有定义返回值(来自外部方法的参数是通用的)。所以编译器无法弄清楚女巫类是什么意思。

这取决于IDE中的即时编译器。 Eclipse Neon 3支持以下表达式:

list = new ArrayList<>(Arrays.asList(b1, b2, c1, c2);

但是为了更好的可读性和调试原因,编写类型总是一个很好的建议。您的代码也可以写成:

ArrayList<A> list = new ArrayList<>(Arrays.<A>asList(b1,b2,c1,c2)); 

有关更多信息,请访问oracle文档: https://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html