有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型中的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.

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


共 (1) 个答案

  1. # 1 楼答案

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