为什么不能将Integer.class对象添加到Collection <class <number>&gt;宾语?

时间:2016-06-01 19:30:00

标签: java class generics

我认为对泛型有很好的理解但是我无法弄清楚为什么我在这里遇到编译错误:

    Collection<Class<Number>> ncs = new HashSet<Class<Number>>();               
    ncs.add(Number.class);      //ok!
    ncs.add(Integer.class);     //compiler error here

如果有人能够解释这一点会很好。 :)

编辑:我理解为什么无法将Integer.class对象添加到Collection&gt;正如this question中所指出的那样。但我不明白为什么我的例子是一样的。当然这不起作用:

Collection<? extends Number> ns = new HashSet<Number>();
ns.add(new Integer(1)); //compiler error here

但这样做:

Collection<Number> ns = new HashSet<Number>();
ns.add(new Integer(1)); //ok!

据我所知,我的初始代码使用相同的概念。

2 个答案:

答案 0 :(得分:3)

鉴于类XYZ,其中XY的子类,X<Z>是{的子类{1}}(例如您使用Y<Z>Collection完成的操作),但HashSet不是Z<X>的子类,因此Z<Y>实例不是Class<Integer>,你不能把前者放在后者的集合中。对于后者,你需要使用通配符,正如romeara所示。

请参阅this question

答案 1 :(得分:2)

我相信您需要将集合声明为

Collection<Class<? extends Number>> ncs = new HashSet<Class<? extends Number>>(); 

因为Alex Hall在他的回答中解释道:

  

Given classes X, Y, and Z, where X is a subclass of Y, X<Z> is a subclass of Y<Z>, but Z<X> is not a subclass of Z<Y>