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