【问题标题】:Generics with autoboxing and unboxing of primitives具有基元自动装箱和拆箱的泛型
【发布时间】:2016-11-23 05:11:31
【问题描述】:

为什么泛型 Java 不会自动装箱和拆箱。

public static <T extends Number> T addNumber(T a , T b)
{
  int c = a*b;
  System.out.println(c);
  return c; 
}

这里为什么不能执行*操作以及为什么不能返回c。任何帮助都会很明显。

【问题讨论】:

    标签: java generics primitive-types autoboxing unboxing


    【解决方案1】:
    int c = a*b;
    

    这个语句确实有效,因为T是由Integer界定的,所以在擦除之后,ab的类型是Integer并且它们被拆箱为int。

    return c;
    

    这不起作用,因为方法的返回类型不是Integer,而是T,即使&lt;T extends Integer&gt;Integerfinal,所以T只能是@ 987654334@,编译器不允许这样做,因为它没有考虑绑定类型的finality(即,就它而言,该方法可以接受绑定类型的子类的实例,并且它不能将int 自动装箱到绑定类型的任何子类)。

    将返回类型更改为Integer将使代码通过编译:

    public static <T extends Integer> Integer addNumber(T a , T b){
      int c = a*b;
      System.out.println(c);
      return c;
    }
    

    当然,将Integer(或任何最终类)用作泛型类型参数的类型绑定是没有意义的。

    【讨论】:

    • 如果 它不允许 *b
    • @Pooja 但是你的类型绑定是Integer 而不是Number。如果您更改绑定到Number 的类型,int c = a.intValue ()*b.intValue (); 将改为工作。 Number 无法自动拆箱为 int。
    • 谢谢。我正在考虑将 Number 自动装箱。
    • 但是如果我用 Integer 扩展它,为什么它不能返回 int 即使 Integer 类不能被子类化。
    • @Pooja int 只能装箱为整数。
    【解决方案2】:

    泛型不应该与原始类型一起使用。 T 表示一个类型参数,它应该是一个对象。
    更多参考
    Why don't Java Generics support primitive types? Java Generics ? , E and T what is the difference?
    Restrictions on generics

    【讨论】:

    • Integer 也是一个包装类,如果我们对其对象进行数学运算,它是允许的,那么为什么不 T extends Integer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2011-05-02
    • 2011-02-28
    相关资源
    最近更新 更多