忽略警告的后果是:java中未经检查的转换

时间:2018-10-29 11:47:13

标签: java generics unchecked-conversion

我知道为什么收到警告(即将原始类型分配给参数化类型),但是如果我忽略警告,我将无法准确获得可能的结果。

List list = new ArrayList();           
List<Integer> iList = list;     // warning: unchecked conversion

3 个答案:

答案 0 :(得分:2)

您在运行时得到ClassCastException。编译器生成的强制转换可能在运行时失败。这将违反通用类型系统提供的基本保证。从字面上看,您的代码类型不安全。检查一下。

List list = new ArrayList();           
List<Integer> iList = list;
list.add("wrong");
for (Integer integer : iList) {
    System.out.println(integer);
}

这是您在运行时遇到的错误。

java.lang.String无法转换为java.lang.Integer

答案 1 :(得分:1)

如果您期望ClassCastException包含一种类型的元素并且包含不相关类型的元素,则忽略警告可能会导致List

例如,以下代码将通过编译(带有警告),并将在运行时抛出ClassCastException

List list = new ArrayList();    
list.add("something");       
List<Integer> iList = list;
Integer i = iList.get(0);

答案 2 :(得分:1)

(唯一的)运行时后果是由于ClassCastException导致的代码失败,无论是直接还是间接的 1

另一个结果是,您允许在编译时检测到并应纠正的错误进行测试,甚至可能在生产中损失成本和后果。

尽管忽略这些警告是一个坏主意,但错误地抑制它们可能会更糟。

  

不正确地压制它们是什么意思?

我的意思是为警告添加@SuppressWarning注释,这实际上会导致运行时异常或另一个(实际)问题。添加@SuppressWarning注释只是为了使编译器“关闭”是一种危险的习惯。


1-例如,如果您抓住并错误地挤压了ClassCastException