假设我需要一些DerivedBuilder
来扩展一些BaseBuilder
。基本构建器具有类似foo
的方法(该方法返回BaseBuilder
)。派生的生成器具有bar
方法。方法bar
应该在方法foo
之后调用。为了做到这一点,我可以像这样在foo
中覆盖DerivedBuilder
方法:
@Override
public DerivedBuilder foo() {
super.foo();
return this;
}
问题是
BaseBuilder
有很多像foo
这样的方法,我必须重写它们中的每一个。我不想这样做,所以我尝试使用泛型:public class BaseBuilder<T extends BaseBuilder> {
...
public T foo() {
...
return (T)this;
}
}
public class DerivedBuilder<T extends DerivedBuilder> extends BaseBuilder<T> {
public T bar() {
...
return (T)this;
}
}
但是问题是我仍然不能写
new DerivedBuilder<DerivedBuilder>()
.foo()
.bar()
即使这里的
T
是DerivedBuilder
。为了不覆盖很多功能,我该怎么办? 最佳答案
您的问题是DerivedBuilder
的定义:
class DerivedBuilder<T extends DerivedBuilder>;
然后使用类型已擦除的参数
new DerivedBuilder<DerivedBuilder<...what?...>>()
实例化它。您将需要一个完全定义的派生类型,如下所示:
public class BaseBuilder<T extends BaseBuilder<T>> {
@SuppressWarnings("unchecked")
public T foo() {
return (T)this;
}
}
public class DerivedBuilder extends BaseBuilder<DerivedBuilder> {
public DerivedBuilder bar() {
return this;
}
}
检查ideone.com。
关于Java通用生成器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39015564/