为什么第4行不生成未经检查的异常?

Rek*_*kha 4 java

/*1.*/ List l = new ArrayList<Number>();
/*2.*/ List<String> ls = l;       // unchecked warning
/*3.*/ l.add(0, new Integer(42)); // another unchecked warning
/*4.*/ String s = ls.get(0);
Run Code Online (Sandbox Code Playgroud)

如果第2行和第3行产生未经检查的警告,那么为什么第4行不会生成未经检查的警告,因为编译器不知道'ls'指的是什么(List<String>List<Integer>).

(注意:从OP的原始帖子进行编辑,以使代码显示为可能的 - 特别是包括List<E>所有地方的类型参数.)

Jon*_*eet 8

编译器认为ls将真正引用字符串列表 - 如果还没有危险的操作 - 第2行,第4行将是"安全的"(就类型安全而言).

如果不涉及其他警告,List<String>则应始终结束引用仅包含对字符串的引用(或null)的列表.但是如果你已经打破了类型安全性,那么所有的赌注都是关闭的(除了VM将在执行时捕获那些类型的违规).

警告显示哪条线是危险的 - 在这种情况下,你正在使用原始类型的地方,即你说,"好吧,我们这里有一个清单.我不知道它里面有什么."

4号线不是指原始类型的任何变量-它是指调用getList<String>,并指派返回值的String变量.如果您认为这应该产生警告,请显示Java语言规范的哪一部分建议警告是适当的 - 我认为您会发现很难这样做.