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

0

你拥有它的方式,print方法SoundDogPrinterSoundCatPrinter不覆盖printSoundPrinter.

类本身需要是泛型的,而不是类中的方法。这样,该print方法实际上将在SoundDogPrinterSoundCatPrinter类中被覆盖。

abstract class SoundPrinter<T extends Animal> {

    public String print(T animal) {
        return "basic: " + animal.sound();
    }
}

class SoundDogPrinter extends SoundPrinter<Dog> {

    public String print(Dog dog) {
        return "dog's processed sound: " + dog.sound();
    }
}

class SoundCatPrinter extends SoundPrinter<Cat> {

    public String print(Cat dog) {
        return "cat's processed sound: " + dog.sound();
    }
}
于 2013-09-19T16:15:06.620 回答