Это, наверное, сложно описать. Тем не менее, я попробую ;)
В стиле 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: Я знаю, что простым обходным решением может быть переопределение всех этих методов в расширенном классе и приведение их к текущему типу. Однако меня интересует более элегантное решение ;)