我有一个名为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>
我想做什么甚至可能?
答案 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();
}