/*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>所有地方的类型参数.)
编译器认为这ls将真正引用字符串列表 - 如果还没有危险的操作 - 第2行,第4行将是"安全的"(就类型安全而言).
如果不涉及其他警告,List<String>则应始终结束引用仅包含对字符串的引用(或null)的列表.但是如果你已经打破了类型安全性,那么所有的赌注都是关闭的(除了VM将在执行时捕获那些类型的违规).
警告显示哪条线是危险的 - 在这种情况下,你正在使用原始类型的地方,即你说,"好吧,我们这里有一个清单.我不知道它里面有什么."
4号线不是指原始类型的任何变量-它仅是指调用get上List<String>,并指派返回值的String变量.如果您认为这应该产生警告,请显示Java语言规范的哪一部分建议警告是适当的 - 我认为您会发现很难这样做.
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |