2014-05-20 7 views
0

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

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 

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

ответ

3

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

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-дженериков :(

+0

Таким образом, я не смог вызвать метод подкласса. Ошибка компиляции остается. Кроме того, существует проблема с внутренним классом customexception. Таким образом, компилятор не позволяет наследованию от Throwable. – user3354638

+0

@ user3354638: Ну, вы раньше не упоминали об исключениях, но подкласс должен быть хорошим, если вы дадите ему правильный 'T'. Я приведу пример. –

+0

Я добавил методы вызова заклинателя ко всем подклассам. Это ужасно, но сейчас работает. – user3354638

Смежные вопросы