我知道为什么我会收到警告(即,将原始类型分配给参数化类型),但如果我忽略警告,我并不完全了解可能的序列。
List list = new ArrayList();
List<Integer> iList = list; // warning: unchecked conversion
我知道为什么我会收到警告(即,将原始类型分配给参数化类型),但如果我忽略警告,我并不完全了解可能的序列。
List list = new ArrayList();
List<Integer> iList = list; // warning: unchecked conversion
你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
ClassCastException
如果您希望List
包含一种类型的元素并且它包含不相关类型的元素,则忽略该警告可能会导致。
例如,以下将通过编译(带有警告)并ClassCastException
在运行时抛出:
List list = new ArrayList();
list.add("something");
List<Integer> iList = list;
Integer i = iList.get(0);
(唯一的)运行时后果是由于ClassCastException
's 直接或间接导致代码失败1。
另一个后果是,您允许应该在编译时检测和纠正的错误继续进行测试,并且可能在成本和后果可能明显更糟的生产环境中进行。
虽然忽略这些警告是一个坏主意,但不正确地抑制它们可能会更糟。
你不正确地压制它们是什么意思?
我的意思是@SuppressWarning
为实际上会导致运行时异常或另一个(实际)问题的警告添加注释。添加@SuppressWarning
注释只是为了让编译器“闭嘴”是一种危险的习惯。
1 - 例如,如果你抓住并错误地压扁了一个ClassCastException
!