-3

我在一个示例中工作,它测试代码的遗留和非遗留。这是 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 重新编译以获取详细信息。

SCJP 书 Pg。 没有 602 SCJP 书 Pg。 没有 603

4

1 回答 1

2

add()答案是,参数的类型是什么并不重要——用任何insert()参数调用它都会得到这个警告。警告是对自身的调用,编译器不会通过这两种方法进行扩展的数据流分析。您正在使编译器变得比它更聪明。add()

于 2013-07-07T13:45:11.693 回答