如何创建多个子类级别,以便参数属于子类?

问题描述 投票:0回答:1

在这个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子类来说是失败的。如何使用未确定数量的子类进行设置?

java generics polymorphism
1个回答
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(什么都不做;只是演示汇编)

© www.soinside.com 2019 - 2024. All rights reserved.