java - 在转换为父类(super class)列表时,Java 中未检查的转换

标签 java casting suppress-warnings unchecked

在我的 Java 程序中,我需要转换 List<? extends SomeBaseClass> 类型的对象至List<SomeBaseClass> 。如果我直接转换它,编译器会提示(显示警告)存在未经检查的转换。尽管我可以确定所有对象都可以转换为其父类(super class),但编译器不会注意到它并报告未经检查的强制转换。我怎样才能摆脱警告?除了@SupressWarnings("unchecked")还有其他方法吗?

P.S.:代码运行良好,我只是好奇是否有更好的方法。

编辑:

解决方案:只有在确定将来不会更改列表时才应该进行这种类型的转换。但当我们将单个对象从列表中取出时,最好对其进行强制转换。

最佳答案

编译器会提示,因为如果您添加 SomeBaseClass 类型的对象给您List<SomeBaseClass>列表中,您可能会“违反”您的 List<? extends SomeBaseClass> 的内容列表。

这里是一个例子,当Number时数字为您的 SomeBaseClass :

List<? extends Number> doubles = new ArrayList<Double>();
List<Number> nums = (List<Number>) doubles;

nums.add(new Integer(5));    // no compiler complaints here...

// doubles now contains an Integer value!

如果您的情况没有办法解决这个问题,我相信 @SuppressWarnings("unchecked")是您最好的选择。

关于java - 在转换为父类(super class)列表时,Java 中未检查的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4480224/

相关文章:

c - 避免过度转换

sql - 对 INT 求和时出现算术溢出错误,如何将其转换为 BIGINT?

c++ - 如何在 CMakeLists.txt 文件中的第三方库头文件中抑制 Clang 警告?

java - Java Web 应用程序中的 MongoDB 配置

java - 无法将Gradle项目导入Eclipse Photon

kotlin - 将具有任何上限的已转换泛型类型转换为非空

ios - xcode 警告 "estimated section footer height before ios 11"是什么意思?

php - 什么时候在PHP中使用@符号?

java - 从 Java 代码运行 Matlab

java - % 运算符和 IEEEremainder() 方法之间的 Java 差异(如果有的话)?