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();