我在一个示例中工作,它测试代码的遗留和非遗留。这是 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 放入最初键入为 的列表中<Integer>
,所以没问题。但是……如果我们insert()
像这样修改方法会怎样:
void insert(List list) {
list.add(new String("42")); // put a String in the list
// passed in
}
页号:603,第 3 段
当您在前面的示例中调用 addAll() 方法时,它没有向列表中插入任何内容(它只是将集合中的值相加),因此调用者没有风险,他的列表会在某些情况下被修改可怕的方式。它编译并运行得很好。但在第二个版本中,使用添加字符串的旧 insert() 方法,编译器会生成警告:
它在两种情况下都运行良好,并且在两种情况下我都得到相同的警告:,这不应该。
注意:TestBadLegacy.java 使用未经检查或不安全的操作。
注意:使用 -Xlint:unchecked 重新编译以获取详细信息。