[英]Why is it not possible to unbox erased types in Java?
此类中的两个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)
在第一种情况下,编译器知道擦除的类型,在第二种情况下,编译器又忘记了它? 为什么?
您的方法<Type extends Integer> Type add (Type a, Type b)
可以使用Integer
参数调用<Type extends Integer> Type add (Type a, Type b)
。 <Type extends Integer>
边界允许整数的子类型或整数的子类型。 如果有人编写此代码:
Integer i = 1;
Integer k = 2;
add(i, k);
无法确定要调用的方法,因为它们都接受整数参数,并且两者都不比另一个更具体。
如果您具有add(Integer, Integer)
和add(Number, Number)
,则将调用整数add,因为它更具体。 但是在您的情况下,如果使用Integer
则Integer
和Integer or subclass
参数同样特定。
也不要期望+运算符可以处理任何子类。 拆箱是特定于类型的,因为它寻找特定类型,因此需要具有转换为int并实例化装箱值的能力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.