1

貼り付けたコードと同様のことを行う必要があり、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();
    }
}
4

1 に答える 1