Java泛型未检查强制转换-可以在运行时检查吗? /@SuppressWarnings(“未选中”) 私有T提取结果(续){ 对象结果=continuation.getAttribute(“结果”); 返回(T)结果; }

Java泛型未检查强制转换-可以在运行时检查吗? /@SuppressWarnings(“未选中”) 私有T提取结果(续){ 对象结果=continuation.getAttribute(“结果”); 返回(T)结果; },java,generics,casting,Java,Generics,Casting,(在运行时)是否可以验证结果是否可以转换为T?不在此方法中。编译器会删除与T相关的所有类型信息。否。要在运行时进行检查,您需要一个类的实例,以便可以使用。由于类型擦除,您无法使用t访问此文件。类型擦除将在运行时用对象替换t。类型信息在运行时将不存在,因此您无法对照该类型进行检查。在运行时可以这样做,但您需要一个泛型类型标记。通常将其传递到泛型类型的构造函数中 // @SuppressWarnings("unchecked") private <T> T extractResult(C

(在运行时)是否可以验证
结果
是否可以转换为
T

不在此方法中。编译器会删除与
T
相关的所有类型信息。

否。要在运行时进行检查,您需要一个类的实例,以便可以使用。由于类型擦除,您无法使用
t
访问此文件。

类型擦除将在运行时用
对象
替换
t
。类型信息在运行时将不存在,因此您无法对照该类型进行检查。

在运行时可以这样做,但您需要一个泛型类型标记。通常将其传递到泛型类型的构造函数中

// @SuppressWarnings("unchecked")
private <T> T extractResult(Continuation continuation) {
    Object result = continuation.getAttribute("result");
    return (T) result;
}

您可以通过正式尝试捕获ClassCastException来检查它。 然而,这并不能使警告消失

class SomeGeneric<T>

private Class<T> token;

public SomeGeneric(Class<T> token) {
    this.token=token;
}
return token.cast(result) // throws ClassCastException