Resolve problem in implementation of hierarchy of builder interfaces.
interface BuilderA<T extends BuilderA> {
T methodA();
}
interface BuilderB<T extends BuilderB> extends BuilderA<T> {
T methodB();
}
static class ImplBuilderA<T extends ImplBuilderA<T>> implements BuilderA<T> {
@SuppressWarnings("unchecked")
protected T self() {
return (T) this;
}
@Override
public T methodA() {
System.out.println("methodA");
return self();
}
}
static class ImplBuilderB extends ImplBuilderA<ImplBuilderB> implements BuilderB<ImplBuilderB> {
@Override
public ImplBuilderB methodB() {
System.out.println("methodB");
return this;
}
}
@Test
public void testAB() throws Exception {
new ImplBuilderB().methodA().methodB();
new ImplBuilderB().methodB().methodA();
}