在我的项目中,我有一些这样的课程:
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));
答案 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