"Head First Java"を読んでいました。ジェネリックスに関する質問があります。Java - 一般的な引数を受け入れるメソッドにポリモーフィックにオブジェクトを渡す
本書では、多型的にサブタイプをArrayListを受け入れるメソッドに渡すことができないと正しく述べていました。以下の例 -
public class Animal {
}
public class Dog extends Animal {
}
public class Cat extends Animal {
}
public class AnimalTester {
public static void main (String[] args) {
new AnimalTester().go();
}
public void go() {
List<Animal> animalList=new ArrayList<Animal>();
List<Dog> dogList=new ArrayList<Dog>();
processAnimals(animalList); // this would compile
processAnimals(dogList); // this would not compile
}
public void processAnimals(List<Animal> animalList) {
}
}
上記ジェネリック医薬品の使用によって固定することができる。しかし
-
public <T extends Animal> void processAnimals(List<T> animalList) {
}
しかし、何がリストに追加しようとする場合は、上記の場合には、コンパイラは(例外をスローしますこれは本に記載されています)。私はIDEを使って試してみましたが、例外がスローされました。この本はまた、不正なオブジェクト(例えば、cat)がリストに追加されないようにすることを言いました(私たちの場合はdogList)。
しかし、私は(T)を使ってcat/dog/animalオブジェクトをキャストすることでこれを行うことができます。
public <T extends Animal> void processAnimals(List<T> animalList) {
animalList.add(new Animal()); // compilation Error
animalList.add(new Dog()); // compilation Error
animalList.add(new Cat()); // compilation Error
animalList.add((T) new Cat()); // works and I can also cast it back
// to Cat and get a Cat object
}
Javaクリエイターが例外を投げた理由の全体は、誤ったオブジェクトをリストに追加しないでください。しかし、プログラマがそれを明示的にキャストし、「私が何をしているか知っている」と言っているので、Javaはそれを許していますか?
非常に説明的なタイトルではありません。 –
申し訳ありません、今すぐ変更しようとしました。 –