Java泛型未选中强制转换 - 可以在运行时检查吗?

时间:2011-12-14 09:55:55

标签: java generics casting

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

是否(在运行时)可以验证result是否可以投放到T

5 个答案:

答案 0 :(得分:3)

不在此方法范围内。与T相关的所有类型信息都将被编译器删除。

答案 1 :(得分:3)

可以在运行时使用,但是您需要一个泛型类型令牌。通常你将它传递给泛型类型的构造函数

class SomeGeneric<T>

private Class<T> token;

public SomeGeneric(Class<T> token) {
    this.token=token;
}

然后在您的方法中,您可以在运行时检查它

return token.cast(result) // throws ClassCastException

答案 2 :(得分:2)

没有。要在运行时检查,您需要一个类的实例,以便可以使用isAssignableFrom。由于类型擦除,您无法使用T访问此内容。

答案 3 :(得分:0)

类型擦除将在运行时用T替换Object。运行时将缺少类型信息,因此您无法检查类型。

答案 4 :(得分:-1)

您可以通过正式尝试捕获ClassCastException进行检查。 但这不会使警告消失。

相关问题