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

Java 在执行泛型转换时在泛型方法中捕获ClassCastException,java,generics,casting,classcastexception,type-erasure,Java,Generics,Casting,Classcastexception,Type Erasure,假设我有一个方法 @SuppressWarnings("unchecked") public <T extends Number> T getNumber() { try { return (T)number; } catch (ClassCastException e) { return null; } } 将结果转换为ClassCastException 我知道(不知何故)这是因为类型擦除,但有人能提供更深刻的解释吗?为什么异常会升级

假设我有一个方法

@SuppressWarnings("unchecked")
public <T extends Number> T getNumber() {
   try {
      return (T)number; 
   } catch (ClassCastException e) {
      return null;
   }
}
将结果转换为
ClassCastException

我知道(不知何故)这是因为类型擦除,但有人能提供更深刻的解释吗?为什么异常会升级到分配级别,并且无法在方法内部捕获


注意:我确实有一个版本
public T getNumber(Class classT)
,该版本检查classT中的类型,但希望避免传递
classT
,并停止思考上述问题。

在删除类型后,
返回(T)号
变成
返回(数)号
(因为
Number
T
的类型绑定),它不会引发异常(因为
Number
Integer
的实例)

另一方面,任务

Float f = getNumber();
编译为

Float f = (Float) getNumber();
因为
getNumber()
返回一个
Number
,如果没有强制转换,就不能将其分配给
Float
变量

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

类型擦除是从类型(可能包括参数化类型和类型变量)到类型(从未参数化类型或类型变量)的映射。我们为类型T的擦除写入| T |。擦除映射定义如下

类型变量(§4.4)的删除是对其最左边边界的删除


谢谢你清晰易懂的回答(你怎么能写得这么快和清晰,我真羡慕…)。我想如果我把“扩展号码”去掉,那么
只会是
返回(对象)号码
Float f = (Float) getNumber();