Как я могу вернуть ссылку на подкласс из метода суперкласса

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

class SuperClass {
   T someMethodThatDoesSameThingForAllSubclasses() {

    // blablbal
    return reference_of_actual_object;

  }

}

Так что я могу вызывать другие методы подкласса из ссылки на подкласс без приведения. Как это:

SubClass obj=new SubClass(); 
obj.someMethodThatDoesSameThingForAllSubclasses().someSubclassMethod();
//currently this gives compiler error.  because first method returns superclass reference and super class doesn't have     someSubclassMethod

Это возможно и имеет ли смысл попытаться сделать что-то подобное?

1 ответ

Решение

Там нет особенно хороший способ сделать это, что я знаю. Лучшее, что я видел, это просто разыгрывать - что вы можете сделать один раз, конечно:

public class Superclass<T extends Superclass<T>> {
    @SuppressWarnings("unchecked")
    private final T thisAsT = (T) this;

    T someMethodThatDoesSameThingForAllSubclasses() {
       return thisAsT;
    }
}

public class Subclass extends Superclass<Subclass> {
    Subclass subclassOnlyMethod() {
        return this;
    }
}

А потом:

Subclass subclass = new Subclass().someMethodThatDoesSameThingForAllSubclasses()
                                  .subclassOnlyMethod();

Ужасно, что на самом деле актеры ничего не проверяют из-за стирания типов, но это радость обобщений Java:(

Другие вопросы по тегам