转换泛型的 Java 最佳实践

标签 java generics

我有以下代码:

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

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

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

最佳答案

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

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

如果你正在做一些事情,比如设置一些依赖于类型参数的内部状态,那么由于type erasure,就不可能安全地进行转换。 , 其中所有类型参数都替换为 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 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66873775/

相关文章:

java - 泛型和继承?

arrays - swift 3 : Getting error while joining the reversed() array

java - 从 HttpClient 获取 httpresponse

java - 实现队列,使其通用时出现错误

java - 允许 java 程序自动更新的小类

Java泛型方法使用compareTo方法问题从集合中查找 'max'对象

java - 泛型作为方法返回类型

java - 为接受 T 的通用方法提供具体类实例,其中 T 扩展具体类

java - 如何从 Java 设置系统变量?

java - picasso 不显示来自 firebase 的图像