我在一个例子中测试代码的遗留和非遗留。以下是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
}
第0:603页,第3段
在前面的示例中调用addAll()方法时,它没有插入 列表中的任何内容(它只是添加了集合中的值),所以那里 调用者没有风险,他的列表会以某种可怕的方式被修改。它 编译并运行得很好。但在第二个版本中,使用遗留插入() 添加String的方法,编译器生成警告:
它在两种情况下运行良好,在两种情况下我都得到相同的 警告: ,这不应该是。
注意:TestBadLegacy.java使用未经检查或不安全的操作。
注意:使用-Xlint重新编译:取消选中以获取详细信息。
答案 0 :(得分:2)
答案是add()
中insert()
的参数类型无关紧要 - 用任何参数调用它会得到这个警告。警告是在调用add()
本身时,编译器不通过这两种方法进行扩展数据流分析。你正在使编译器比它更聪明。