-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() メソッドを呼び出したとき、リストには何も挿入されませんでした (単にコレクション内の値を追加しただけです)。恐ろしい方法。それはコンパイルされ、問題なく実行されました。しかし、2 番目のバージョンでは、文字列を追加する従来の insert() メソッドを使用すると、コンパイラは警告を生成しました。

どちらの場合も問題なく動作し、どちらの場合も同じWarning:が表示されますが、これはあってはなりません。

注: TestBadLegacy.java は、未チェックまたは安全でない操作を使用します。

注: 詳細については、-Xlint:unchecked で再コンパイルしてください。

SCJP BOOKページ  いいえ 602 SCJP Book Pg.  いいえ 603

4

1 に答える 1

2

答えは、 への引数の型が何であるかは問題ではないということです。任意のadd()引数でinsert()呼び出すと、この警告が表示されます。警告はそれ自体の呼び出しで発生し、コンパイラは両方の方法で拡張データフロー分析を行いません。あなたはコンパイラを実際よりもはるかに賢くしています。add()

于 2013-07-07T13:45:11.693 に答える