在我的项目中,我有一些这样的课程:
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-inference-generic-instance-creation.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句