此类中的两个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)
在第一种情况下,编译器知道擦除类型,在第二种情况下,他再次忘记它?为什么呢?
答案 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 subclass
和Integer
同样具体。
另外,不要指望+运算符可以处理任何子类。取消装箱是特定于类型的,因为它查找特定类型,需要能够转换为int并实例化盒装值。