0

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:错误:名称冲突:add(Type,Type) 和 add(Integer,Integer) 具有相同的擦除
   类型添加(类型a,类型b)
                              ^
  其中 Type 是一个类型变量:
    类型扩展在方法 add(Type,Type) 中声明的 Integer

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

extend.java:10:错误:不兼容的类型
    返回 a + b;
             ^
  必需:类型
  发现:int
  其中 Type 是一个类型变量:
    类型扩展在方法 add(Type,Type) 中声明的 Integer

在第一种情况下,编译器知道擦除的类型,而在第二种情况下,他又忘记了?为什么?

4

1 回答 1

1

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

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

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

如果你有add(Integer, Integer)并且add(Number, Number)整数 add 将被调用,因为它更具体。但是在您的情况下,如果使用 an ,参数IntegerInteger or subclass同样具体Integer

也不要期望 + 运算符可以工作任何子类。拆箱是特定类型的,因为它会查找特定类型,需要能够转换为 int 并实例化装箱值。

于 2013-10-09T10:07:38.977 回答