强制转换泛型的Java最佳实践

我有以下代码:

class ParametrizedObject<T> {...}
...
if (unknownObject instanceof ParametrizedObject) {
  ParametrizedObject casted = (ParametrizedObject) unknownObject;
}

此代码触发 rawtypes 警告。有没有办法/最佳实践来避免它?

注意:该类ParametrizedObject是框架的一部分,我无法更改它。

回答

这实际上取决于您对转换对象的处理方式,但是如果您不关心类型参数,则可以使用通配符来删除警告:

if (unknownObject instanceof ParametrizedObject) {
    var casted = (ParametrizedObject<?>) unknownObject;
    ...
}

如果你正在做一些事情,比如设置一些依赖于类型参数的内部状态,那么由于类型擦除,不可能安全地进行转换,所有类型参数都被替换为Object

class ParametrizedObject<T> {
    T data;

    void setData(T data) {
        this.data = data;
    }
}

MyClass someObject = ...;
ParametrizedObject<?> casted = (ParametrizedObject<?>) unknownObject;
casted.setData(someObject);  // won't compile

MyClass someObject = ...;
ParametrizedObject<MyClass> casted = (ParametrizedObject<MyClass>) unknownObject;
casted.setData(someObject); // compiles but above cast generates a warning


以上是强制转换泛型的Java最佳实践的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>