貼り付けたコードと同様のことを行う必要があり、2 つのオプションがありました。クラス定義にジェネリックがあるもの (結果としていくつかの警告がありました) と次のもの。
型消去のため、基本メソッドを子孫の実装でオーバーライドできませんでした。
1つは正しく安全なアプローチだと思いますか?
public class Main {
public static void main(String args[]) {
List<Animal> animals = Arrays.asList(new Dog(), new Cat(), new Dog());
Map<Class<? extends Animal>, SoundPrinter> printers = new HashMap<Class<? extends Animal>, SoundPrinter>();
printers.put(Dog.class, new SoundDogPrinter());
printers.put(Cat.class, new SoundCatPrinter());
for (Animal animal:animals){
SoundPrinter printer = printers.get(animal.getClass());
System.out.println(printer.print(animal));
}
}
}
class Animal {
public String sound() {
return "animal sound";
}
}
class Dog extends Animal {
public String sound() {
return "dog sound";
}
}
class Cat extends Animal {
public String sound() {
return "cat sound";
}
}
abstract class SoundPrinter {
public <T extends Animal> String print(T animal) {
return "basic: " + animal.sound();
}
}
class SoundDogPrinter extends SoundPrinter {
public String print(Dog dog) {
return "dog's processed sound: " + dog.sound();
}
}
class SoundCatPrinter extends SoundPrinter {
public String print(Cat dog) {
return "cat's processed sound: " + dog.sound();
}
}