在StackOverFlow question之后,假设我想扩展到另一级别的子类,比如Mallards,我该怎么做?
public abstract class Animal <A extends Animal<A>>
{
public abstract A copyAnimal(A animal);
}
public class Duck extends Animal<Duck>
{
@Override
public Duck copyAnimal(Duck duck)
{
return copyOfDuck;
}
}
class Mallard extends Duck<Mallard>
{
public Mallard copyAnimal(Mallard mallard)
{
return copyOfMallard;
}
}
对于Duck子类来说,一切都很有效但是对于Mallard子类来说却失败了。如何使用未确定数量的子类进行设置?
答案 0 :(得分:5)
你只需继续使用类型变量:
class Duck<D extends Duck<D>> extends Animal<D> {}
然后
class Mallard extends Duck<Mallard> {}
是的,它太乱了!
我经常看到这种模式与类的构建器一起使用,这些类被扩展为创建子类的构建器。它使代码完全混乱,在我看来最好避免使用。
如何使用它的一个例子:
abstract class Animal<A extends Animal<A>> {
abstract A copyAnimal(A animal);
}
class Duck<D extends Duck<D>> extends Animal<D> {
void quack() {}
D copyAnimal(D duck) {
duck.quack();
return duck;
}
}
class Mallard extends Duck<Mallard> {
Mallard copyAnimal(Mallard duck) {
duck.quack();
return duck;
}
}
Ideone demo(什么都不做;只是演示编译)