进行泛型转换时在泛型方法中捕获 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;
}
}
假设 number
是 Integer
的实例,调用方法如
Float f = getNumber();
结果为 ClassCastException
。
我知道(不知何故)这是因为 type erasure 但有人可以提供更深刻的解释为什么异常升级到赋值级别并且在方法内部不可捕获吗?
注意: 我确实有版本 public <T extends Number> T getNumber(Class<T> classT)
检查来自 classT 的类型但希望摆脱传递 classT
并停止思考上面的问题。
类型擦除后,return (T)number
变为 return (Number)number
(因为 Number
是 T
的类型绑定),这不会引发异常(因为 number
是 Integer
).
的实例
另一方面,作业
Float f = getNumber();
编译为
Float f = (Float) getNumber();
因为 getNumber()
returns a Number
,如果不进行强制转换就不能分配给 Float
变量。
当 getNumber()
不是 Float
时,此转换抛出 ClassCastException
。
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.
假设我有一个方法
@SuppressWarnings("unchecked")
public <T extends Number> T getNumber() {
try {
return (T)number;
} catch (ClassCastException e) {
return null;
}
}
假设 number
是 Integer
的实例,调用方法如
Float f = getNumber();
结果为 ClassCastException
。
我知道(不知何故)这是因为 type erasure 但有人可以提供更深刻的解释为什么异常升级到赋值级别并且在方法内部不可捕获吗?
注意: 我确实有版本 public <T extends Number> T getNumber(Class<T> classT)
检查来自 classT 的类型但希望摆脱传递 classT
并停止思考上面的问题。
类型擦除后,return (T)number
变为 return (Number)number
(因为 Number
是 T
的类型绑定),这不会引发异常(因为 number
是 Integer
).
另一方面,作业
Float f = getNumber();
编译为
Float f = (Float) getNumber();
因为 getNumber()
returns a Number
,如果不进行强制转换就不能分配给 Float
变量。
当 getNumber()
不是 Float
时,此转换抛出 ClassCastException
。
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.