进行泛型转换时在泛型方法中捕获 ClassCastException

Catching ClassCastException in a generic method when doing generic cast

假设我有一个方法

@SuppressWarnings("unchecked")
public <T extends Number> T getNumber() {
   try {
      return (T)number; 
   } catch (ClassCastException e) {
      return null;
   }
}

假设 numberInteger 的实例,调用方法如

Float f = getNumber();

结果为 ClassCastException

我知道(不知何故)这是因为 type erasure 但有人可以提供更深刻的解释为什么异常升级到赋值级别并且在方法内部不可捕获吗?

注意: 我确实有版本 public <T extends Number> T getNumber(Class<T> classT) 检查来自 classT 的类型但希望摆脱传递 classT 并停止思考上面的问题。

类型擦除后,return (T)number 变为 return (Number)number(因为 NumberT 的类型绑定),这不会引发异常(因为 numberInteger).

的实例

另一方面,作业

Float f = getNumber();

编译为

Float f = (Float) getNumber();

因为 getNumber() returns a Number,如果不进行强制转换就不能分配给 Float 变量。

getNumber() 不是 Float 时,此转换抛出 ClassCastException

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.