Suppose I have a method
@SuppressWarnings(\"unchecked\")
public T getNumber() {
try {
return (T)number;
} catch (ClassC
After type erasure, return (T)number
becomes return (Number)number
(since Number
is the type bound of T
), which doesn't throw an exception (since number
is an instance of Integer
).
On the other hand, the assignment
Float f = getNumber();
is compiled to
Float f = (Float) getNumber();
since getNumber()
returns a Number
, which can't be assigned to a Float
variable without a cast.
This cast throws the ClassCastException
when getNumber()
is not a Float
.
4.6. Type Erasure
Type erasure is a mapping from types (possibly including parameterized types and type variables) to types (that are never parameterized types or type variables). We write |T| for the erasure of type T. The erasure mapping is defined as follows...
The erasure of a type variable (§4.4) is the erasure of its leftmost bound.