我认为对泛型有很好的理解但是我无法弄清楚为什么我在这里遇到编译错误:
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!
据我所知,我的初始代码使用相同的概念。
答案 0 :(得分:3)
鉴于类X
,Y
和Z
,其中X
是Y
的子类,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>