ArrayList 不兼容的类型

舒罗克

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

class A
class B extends A
class C extends A

现在,在我的主类中,我有一个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));

一切都好。这是为什么?

本尼·雷曼

由于 Java7 Oracle 引入了菱形运算符。此运算符使用反射来根据参数或返回值确定类型。之前你总是要填写泛型类的类型。

问题是您在另一个类中有一个泛型类,并且对于内部泛型方法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-in​​ference-generic-instance-creation.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章