具有自动装箱和拆箱原语的泛型

时间:2016-07-20 05:51:33

标签: java generics primitive-types autoboxing unboxing

为什么Generics Java不会发生原语的自动装箱和拆箱。

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

这就是为什么*操作无法执行以及为什么无法返回c。任何帮助都会很明显。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

int c = a*b;

此声明确实有效,因为TInteger限制,因此在删除后,ab的类型为Integer,它们是return c; unboxed to int。

Integer

这不起作用,因为方法的返回类型不是T,而是<T extends Integer>,即使Integerfinal是{{1} },所以T只能是Integer,编译器不允许这样做,因为它不会考虑绑定类型的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(或任何最终类)作为泛型类型参数的类型绑定是没有意义的。