1

我知道为什么我会收到警告(即,将原始类型分配给参数化类型),但如果我忽略警告,我并不完全了解可能的序列。

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

3 回答 3

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

于 2018-10-29T11:51:03.567 回答
1

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

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

List list = new ArrayList();    
list.add("something");       
List<Integer> iList = list;
Integer i = iList.get(0);
于 2018-10-29T11:49:13.547 回答
1

(唯一的)运行时后果是由于ClassCastException's 直接或间接导致代码失败1

另一个后果是,您允许应该在编译时检测和纠正的错误继续进行测试,并且可能在成本和后果可能明显更糟的生产环境中进行。

虽然忽略这些警告是一个坏主意,但不正确地抑制它们可能会更糟。

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

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


1 - 例如,如果你抓住并错误地压扁了一个ClassCastException!

于 2018-10-29T12:59:04.610 回答