泛型中的java非遗留代码给出了编译器警告,这是不应该的。请把它清理干净
我在一个例子中测试代码的遗留和非遗留。下面是Kathy/bates从SCJP获得的一个示例。我从那本书中读到了这些东西,并试图在我的系统中进行同样的训练。正如书中提到的那样,它运转良好。但对于这两个示例,我都尝试了编译器生成下面提到的警告。但是当我们运行非遗留代码时,它不应该警告我们。我不知道书中的例子中是否有错误,我所做的是错误的。请澄清我的问题。提前谢谢!下面我附上了这本书的截图以供参考
import java.util.*;
public class TestBadLegacy {
public static void main(String[] args) {
List < Integer > myList = new ArrayList < Integer > ();
myList.add(4);
myList.add(6);
Inserter in = new Inserter(); in .insert(myList); // pass List<Integer> to legacy code
}
}
class Inserter {
// method with a non-generic List argument
void insert(List list) {
list.add(new Integer(42)); // adds to the incoming list
}
}
当然,这个代码是有效的。它编译并运行。insert()方法将
整数输入到最初键入为<Integer>
的列表中,因此没有问题。
但是…如果我们修改insert()
方法如下:
void insert(List list) {
list.add(new String("42")); // put a String in the list
// passed in
}
第603页,第3段
在前面的示例中调用addAll()方法时,它没有插入 列表中的任何内容(它只是将集合中的值相加),因此 打电话的人没有风险知道他的名单会以某种可怕的方式被修改。信息技术 编译并运行良好。但是在第二个版本中,使用遗留的insert() 方法添加字符串时,编译器生成警告:
它在两种情况下都运行良好,在这两种情况下,我都得到了相同的警告:,这不应该是
Note: TestBadLegacy.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
# 1 楼答案
答案是
add()
的参数类型在insert()
中并不重要,使用任何参数调用它都会得到此警告。警告出现在对add()
本身的调用中,编译器不会通过这两种方法进行扩展数据流分析。你正在使编译器变得比它更聪明