繁体   English   中英

为什么无法在Java中取消装箱已擦除类型?

[英]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,因为它更具体。 但是在您的情况下,如果使用IntegerIntegerInteger or subclass参数同样特定。

也不要期望+运算符可以处理任何子类。 拆箱是特定于类型的,因为它寻找特定类型,因此需要具有转换为int并实例化装箱值的能力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM