java - 在Java中,为什么不能取消对已经删除类型的?

  显示原文与译文双语对照的内容
99 1

此类中的两个 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)

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

时间: 原作者:

72 2

你的方法 <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),整数加法将被调用因为它更具体。 但是如果使用 Integer,那么 IntegerInteger or subclass 都是相同的。

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

...