我知道为什么收到警告(即将原始类型分配给参数化类型),但是如果我忽略警告,我将无法准确获得可能的结果。
List list = new ArrayList();
List<Integer> iList = list; // warning: unchecked conversion
答案 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
!