泛型中的非遗留代码给出了编译器警告,而不应该是。请清楚

时间:2013-07-07 13:33:40

标签: java generics collections compiler-warnings

我在一个例子中测试代码的遗留和非遗留。以下是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重新编译:取消选中以获取详细信息。

SCJP BOOK Pg. No 602 SCJP Book Pg. No 603

1 个答案:

答案 0 :(得分:2)

答案是add()insert()的参数类型无关紧要 - 用任何参数调用它会得到这个警告。警告是在调用add()本身时,编译器通过这两种方法进行扩展数据流分析。你正在使编译器比它更聪明。