为什么在Java中无法删除已删除的类型?

时间:2013-10-09 09:50:53

标签: java type-erasure unboxing

此类中的两个add方法具有相同的已删除签名:

class extend
{
  Integer add (Integer a, Integer b)
  {
    return a + b;
  }

  <Type extends Integer> Type add (Type a, Type b)
  {
    return a + b;
  }
}

这使得它们不可能在同一个班级中。编译器报告以下错误:

extend.java:8: error: name clash: add(Type,Type) and add(Integer,Integer) have the same erasure
   Type add (Type a, Type b)
                              ^
  where Type is a type-variable:
    Type extends Integer declared in method add(Type,Type)

但如果它们是等价的,为什么在第二种情况下没有完成拆箱。编译器报告以下错误:

extend.java:10: error: incompatible types
    return a + b;
             ^
  required: Type
  found:    int
  where Type is a type-variable:
    Type extends Integer declared in method add(Type,Type)

在第一种情况下,编译器知道擦除类型,在第二种情况下,他再次忘记它?为什么呢?

1 个答案:

答案 0 :(得分:1)

可以使用<Type extends Integer> Type add (Type a, Type b)参数调用您的方法Integer<Type extends Integer>边界允许Integer或Integer的子类型。 如果有人写这段代码:

Integer i = 1;
Integer k = 2;
add(i, k);

无法确定调用哪个方法,因为它们都接受整数参数,并且两者都不比另一个更具体。

如果您有add(Integer, Integer)add(Number, Number),则会调用整数add,因为它更具体。但在您的情况下,如果使用Integer,参数Integer or subclassInteger同样具体。

另外,不要指望+运算符可以处理任何子类。取消装箱是特定于类型的,因为它查找特定类型,需要能够转换为int并实例化盒装值。