I\'m trying to have an abstract base class for some builder classes so I can easily reuse code between the Builder implementations. I want my builders to support method chaining
You want to declare T
as extends AbstractBuilder
in AbstractBuilder
.
Use an abstract protected
method to get this
of type T
.
abstract class AbstractBuilder> {
protected abstract T getThis();
public T foo() {
// set some property
return getThis();
}
}
class TheBuilder extends AbstractBuilder {
@Override protected TheBuilder getThis() {
return this;
}
...
}
Alternatively, drop the generic type parameter, rely on covariant return types and make the code cleaner for clients (although usually they would be using TheBuilder
rather than the largely implementation detail of the base class), if making the implementation more verbose.