重复使用前面的例子,想象一个动物园,动物园管理员必须"处理"新到达的动物(考虑将它们检入动物园).每只动物的登记过程取决于其类别分类(哺乳动物,鸟类等).
这些过程因分类学课程之间的根本差异而不同 - 例如,鸟类有翅膀,哺乳动物有牙齿.您可能还有一些过程的共享位对所有动物都适用,但我在这里省略了它们.
这是代码:
Animal.java
public interface Animal {
public AnimalProcessor<? extends Animal> getAnimalProcessor();
}
Run Code Online (Sandbox Code Playgroud)
Mammal.java
public abstract class Mammal implements Animal {
@Override
public AnimalProcessor<Mammal> getAnimalProcessor() {
return new MammalProcessor();
}
// Specific to mammals
public abstract int getToothCount();
}
Run Code Online (Sandbox Code Playgroud)
Bird.java
public abstract class Bird implements Animal {
@Override
public AnimalProcessor<Bird> getAnimalProcessor() {
return new BirdProcessor();
}
// Specific to birds
public abstract float getWingspan();
}
Run Code Online (Sandbox Code Playgroud)
AnimalProcessor.java
public interface AnimalProcessor<T extends Animal> {
public void process(T critter);
} …Run Code Online (Sandbox Code Playgroud)