在类型擦除之后,return (T)number
变为return (Number)number
(因为Number
是的类型边界T
),不会引发异常(因为number
是的实例Integer
)。
另一方面,分配
Float f = getNumber();
编译为
Float f = (Float) getNumber();
由于会getNumber()
传回Number
,如果没有强制转换,就无法将其指派给Float
变数。
此转换抛出ClassCastException
when getNumber()
不是Float
。
类型擦除是从类型(可能包括参数化类型和类型变量)到类型(从不参数化类型或类型变量)之间的映射。我们写| T | 用于擦除类型T。擦除映射定义如下…
擦除类型变量(第4.4节)是擦除其最左边界。