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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…