bpg
9/18/2014 - 3:25 PM

Resolve problem in implementation of hierarchy of builder interfaces.

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();
    }