самореферентные методы с общим типом возвращаемого значения для нескольких унаследованных классов

Это, наверное, сложно описать. Тем не менее, я попробую ;)

В стиле fluent обычно метод класса возвращает сам экземпляр класса (this).

public class A {

    public A doSomething() {

        // do something here

        return this;
    }

}

При расширении такого класса текучего стиля это можно сделать довольно просто на первом этапе наследования через универсальный тип и приведение возвращаемого типа к этому универсальному типу в суперклассе.

public class A<T extends A<T>> {

    public T doSomething() {

        // do something here

        return (T) this;
    }

}

public class B extends A<B> {

    // an extended class of class A

}

Однако при выполнении еще одного шага наследования в этом расширенном классе у меня возникают проблемы при попытке определить общий тип возвращаемого значения методов (в высших классах) и само описание класса, например, метод в супер-суперкласс вернет не тип расширенного класса, а тип суперкласса. Однако мое намерение состояло в том, чтобы эти методы свободного стиля всегда возвращали тип текущего класса (а не высших классов).

Так можно ли определить решение, используя дженерики?

PS: Я знаю, что простым обходным решением может быть переопределение всех этих методов в расширенном классе и приведение их к текущему типу. Однако меня интересует более элегантное решение ;)

9
задан zazi 21 June 2012 в 06:20
поделиться