2013-11-19 2 views
0

Скажем, у меня есть абстрактный универсальный класс:Вызов функции Generic Java на абстрактном уровне

public abstract class QuestionObject<T extends Answerable<?>> { 
    public abstract T returnAnswerable(); 
    public abstract void renderQuestionLayout(T answer); 
} 

и сопутствующий общий класс, чтобы пойти с ним:

public interface Answerable<T> { 
... 
} 

У меня есть куча подклассов расширить QuestionObject и иметь свой собственный ответ. Так, например, TrueFalseQuestion будет объявлен с TrueFalseAnswer:

public class TrueFalseQuestion extends QuestionObject<TrueFalseAnswer> { 
... 
} 

Давайте пилой я хочу вызвать метод renderQuestionLayout на уровне QuestionObject. Это возможно? Что-то вроде:

QuestionObject<?> q = getCurrentQuestion(); 
Answerable<?>a = getAnswer(); 
q.renderQuestionLayout(a); 

не работает.

ответ

1

Посмотрите на свой последний фрагмент кода:

QuestionObject<?> q = getCurrentQuestion(); 
Answerable<?>a = getAnswer(); 
q.renderQuestionLayout(a); 

? подстановочные не помогает компилятор определить, какую версию renderQuestionLayout позвонить. Прямо сейчас, q является экземпляром вашего абстрактного родительского класса, где метод имеет абстрактное объявление.

Вам необходимо явно привести к соответствующему типу подкласса, или пересмотреть ваш дизайн немного, так что вы не слепки везде: р

+0

Я полагал, что это может быть ответом (явно литье). Считаете ли вы, что это пример плохого дизайна? Как выглядит редизайн? Спасибо. – IcedDante

+0

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

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