如何为返回实现类型的抽象类编写方法?

时间:2015-03-09 14:50:53

标签: java generics

我有一个名为FooFactory的java抽象类。其中一个方法是withDate,这显然表明我想最终用给定的Date构建一个Foo的实现。

我的问题是这个。如何从withDate返回我的FooFactory实现的实例?这是我试过的:

abstract class FooFactory<T extends FooFactory<T>>
{
    private date;

    public T withDate(Date date)
    {
        this.date = date;
        // Does not work
        return this;
    }

    public abstract Foo build();

    // more with methods and a build method
}

我想做的是做这样的事情:

public final class BarFooFactory extends FooFactory<BarFooFactory>
{
    @Override
    public BarFoo build()
    {
        BarFoo barFoo = new BarFoo()
        super.populateFooProperties(barFoo);
        return barFoo;
    }
}

对于那些好奇为什么我只是不想返回一个FooFactory,原因是编译器将在FooFactory的上下文中使用调用和构建调用来解释future,因此我无法真正链接调用。 / p>

我想做什么甚至可能?

2 个答案:

答案 0 :(得分:3)

想出来。我只需要在返回时将“this”转换为T.所以代码看起来更像是这样:

abstract class FooFactory<T extends FooFactory<T>>
{
    private date;

    public T withDate(Date date)
    {
        this.date = date;
        // This works
        return (T) this;
    }

    public abstract Foo build();

    // more with methods and a build method
}

现在new BarFooFactory().withDate(new Date())返回BarFooFactory而不是FooFactory。

答案 1 :(得分:3)

我已经看到应用于类似问题的解决方案是定义一个返回子类实例的getThis()抽象方法。它避免了未经检查的施法警告,但可能会使一些纯粹主义者感到沮丧。

abstract class FooFactory<T extends FooFactory<T>> {
  private Date date;

  public abstract T getThis();

  public T withDate(Date date) {
    this.date = date;
    return getThis();
  }