【发布时间】:2013-09-19 16:12:46
【问题描述】:
我必须做一些类似于粘贴代码的事情,我有两个选择。在类定义中具有泛型的一个(结果有一些警告)和以下一个。
由于类型擦除,我无法用后代的实现覆盖基本方法。
您认为这是一种正确且安全的方法吗?
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();
}
}
【问题讨论】:
-
如果您在
Map<Class<? extends Animal>, SoundPrinter>中对类进行硬编码,我看不出泛型添加了什么... -
我在这里看不到策略模式。你想达到什么目标?每只动物一台打印机?通用打印机?
-
@SotiriosDelimanolis SoundPrinter 应该是一个抽象基类,用于打印各种动物,而不仅仅是狗
-
@Chirs 是啊是啊,写得太快了。
-
@BoristheSpider 我需要泛型来打印基类 SoundPrinter。
标签: java generics overriding strategy-pattern