コードのレガシーと非レガシーをテストする例で作業していました。これは 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 で再コンパイルしてください。