请查看以下代码。为什么抛出这个错误,即使Integer是从Number继承而且为什么同样的错误情况不存在于'?扩展数字'使用。
public class testGeneric
{
public static void main(String[] args)
{
Class<Integer> classint = int.class;
Class<Number> classnum1 = int.class;// Error Type mismatch: cannot convert from
// Class<Integer> to Class<Number>
Class<? extends Number> classnum2 = int.class;
}
}
答案 0 :(得分:1)
在泛型类型中,你没有协方差(如果这是我要找的那个词)。
他们需要完全匹配。
Class<Number>
只能由Number.class
分配。
如果要允许子类(或超类),则必须使用extends
或super
。
Class<? extends Number>
可以Integer.class
(其中包括Long.class
或Number.class
)。
Class<? super Number>
可以Number.class
或Object.class
。
这与能够处理子类实例的泛型类型的方法不同。
例如,您可以在Integer
中添加List<Number>
,但这不会将List<Number>
分配给List<Integer>
(反之亦然)。
可以在需要超类的情况下使用对象实例,但泛型类型不能。
答案 1 :(得分:0)
根据我的理解
对于Integer和int, Autoboxing and Unboxing
正在发生,但是Number和int不可能。
有关自动装箱的信息,请参阅https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html