Java 通配符转换最佳实践

标签 java generics casting wildcard

我对此进行了广泛的研究,但似乎找不到适合这种情况的最佳实践。

ArrayList<GenericObject<?>> list = new ArrayList<>();
list.add( new GenericObject<Integer>(6) ); // Autoboxing
list.add( new GenericObject<String>("HI") );
if(list.get( 0 ).getGenaricValue().getClass() == Integer.class){

        GenericObject<Integer> gi = (GenericObject<Integer>) list.get( 0 );
        System.out.println("Was Integer");
        System.out.println(gi);
    }
}

虽然此代码块有效,但从 GenericObject 到 GenericObject 的转换给出了未经检查的警告。现在你可以看到我已经用我的 if 语句清楚地检查了类型,所以我对异常没有偏执但​​有没有更好的方法来做到这一点而不必抑制未经检查的警告?这种情况有最佳实践吗? 我已经阅读了整个泛型 oracle 教程 here 我已经阅读了很多 stackoverflow 帖子,但似乎没有一个能回答这个问题。任何帮助将不胜感激。

最佳答案

不,没有比通过解释抑制警告更好的方法了:

@SuppressWarnings("unchecked") // this is okay because [insert reasoning]
GenericObject<Integer> gi = (GenericObject<Integer>) list.get( 0 );

请注意,但这不一定是一个好的设计 - 如果可能,最好避免未经检查的强制转换,如果只是因为它们很难证明是正确的。例如,如果 gi 会怎样?之前被输入为 GenericObject<Object>GenericObject<Number>刚好拿着一个Integer ?检查并强制转换值本身可能会更好:

GenericObject<?> go = list.get(0);
Object obj = go.getGenericValue();
if (obj instanceof Integer) { // or obj.getClass() == Integer.class
     System.out.println("Was Integer");
}

关于Java 通配符转换最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21240380/

相关文章:

java - 将 MP3 播放列表保存到文件

java - 自动更新类内的共享首选项

Java 接口(interface)函数返回实现它的类

c# - 如何将数据表转换为泛型

c++ - (类型)值和类型(值)有什么区别?

java - 读取 yaml 文件时发生 UnrecognizedPropertyException

java - Mac 操作系统上的 Windows 批处理文件相当于什么?

java - 在 Java 运行时使用泛型 - (T)object - 进行强制转换会发生什么情况?

c++ - 将普通指针转换到 std::shared_ptr 似乎不起作用

sql - DB2 从 YYYYMMDD 转换为日期