问题
Why autoboxing and unboxing of primitives not happens with Generics Java.
public static <T extends Number> T addNumber(T a , T b)
{
int c = a*b;
System.out.println(c);
return c;
}
Here why * operation can't be performed and why can't return c.Any help would be appreciable.
回答1:
Generics are not supposed to be used with primitive types. T indicates a type parameter which should be an object.
More reference
Why don't Java Generics support primitive types?
Java Generics ? , E and T what is the difference?
Restrictions on generics
回答2:
int c = a*b;
This statement actually works, since T
is bounded by Integer
, so after erasure, the types of a
and b
are Integer
and they are unboxed to int.
return c;
This doesn't work since the return type of the method is not Integer
, it is T
, and even though <T extends Integer>
and Integer
is final
, so T
can only be Integer
, the compiler doesn't allow that, since it doesn't take the finality
of the type bound into account (i.e. as far as it's concerned, the method can accept instances of a sub-class of the type bound, and it can't auto-box int
to any sub-class of the type bound).
Changing the return type to Integer
will make the code pass compilation :
public static <T extends Integer> Integer addNumber(T a , T b){
int c = a*b;
System.out.println(c);
return c;
}
Of course, it doesn't make sense to use Integer
(or any final class) as a type bound for a generic type parameter.
来源:https://stackoverflow.com/questions/38473232/generics-with-autoboxing-and-unboxing-of-primitives