通用类引用

时间:2014-11-11 05:18:15

标签: java

请查看以下代码。为什么抛出这个错误,即使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;
        }
  }

2 个答案:

答案 0 :(得分:1)

在泛型类型中,你没有协方差(如果这是我要找的那个词)。

他们需要完全匹配。

Class<Number>只能由Number.class分配。

如果要允许子类(或超类),则必须使用extendssuper

Class<? extends Number>可以Integer.class(其中包括Long.classNumber.class)。

Class<? super Number>可以Number.classObject.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