2014-06-16 6 views
0

В настоящее время я пытаюсь реорганизовать часть своего кода и наткнулся на функцию, которую я раньше не использовал в Java, связанной с Generics.Использование обобщений для возврата более одного типа

Я пытаюсь вернуть ArrayList<?> определенного типа на основе параметра, переданного в метод. Параметр принимает перечисление, которое определяет требуемый тип ArrayList<T> Чтобы вернуться, что-то вроде этого, но я получаю ошибки от метода прототипа:

// Retrieves an ArrayList of questions available for a particular QuestionType 
    public <T extends Question> ArrayList<T extends Question> getQuestions(QuestionType type) { 
     switch (type) { 
     case BASE_QUESTION: 
      return mQuestions; // ArrayList<Question> 

     case MULTIPLE_ANSWER_QUESTION: 
     case MULTIPLE_CHOICE_QUESTION: 
     case TRUE_FALSE_QUESTION: 
      return mMultipleAnswerQuestions; // ArrayList<MultipleAnswerQuestion> 

     case MATCHING_QUESTION: 
      return mMatchingQuestions; // ArrayList<MatchingQuestion> 

     case BLANK_QUESTION: 
      return mBlankQuestions; // ArrayList<BlankQuestion> 

     default: 
      // TODO Perfect place to throw an exception 
      Log.d(TAG, "Exception: Provided a non-existant QuestionType"); 
     } 
    } 

Дополнительная информация: Этот метод существует в пределах пользовательского объекта, который содержит несколько ArrayList of Questions, организованный по типу. Этот метод не существует в классе SuperClass типа Question.

// CLASS HIERARCHY 
// SuperClass 
Question 

// SubClasses of Question 
MultipleAnswerQuestion 
MultipleChoiceQuestion 
TrueFalseQuestion 
MatchingQuestion 
BlankQuestion 

Может кто-нибудь объяснить мне, как прототип метода, который достигает этой задачи?

Спасибо за понимание и помощь.

+1

Вам не нужно указывать 'extends Question' еще раз в возвращаемом типе. Вы уже указали это. Кроме того, в этом случае кажется, что шаблон может быть лучше, потому что вы не используете 'T' – awksp

+0

Не могли бы вы дать ответ, демонстрирующий этот подход? – Matt

+0

Какая ошибка вы получаете? – shmosel

ответ

2

Эти конкретные ошибки компиляции, которые Вы получили, вероятно, потому, что ошибка синтаксиса объявлять границы на T второй раз предотвратить компилятор от признания ArrayList<T extends Question> в качестве типа возвращаемого значения. Поэтому, если вы либо удалите extends Question, либо измените свой тип возврата на ограниченный шаблон, ошибки компиляции должны уйти.

В обобщенных методах вы указываете только ограничения на параметр типа - при объявлении их в начале подписи метода. Другими словами, просто используйте ArrayList<T> как возвращаемый тип вместо ArrayList<T extends Question>, потому что вы уже указали, какие границы были на T в общем методе.

Таким образом, вы бы в конечном итоге с чем-то вроде

public <T extends Question> ArrayList<T> getQuestions(QuestionType type) { 
    ... 
} 

Кроме того, так как вы не появляетесь на самом деле использованиеT в вашем методе, это, вероятно, лучше пропустить общий метод в целом и просто используйте ограниченный шаблон в возвращаемом значении, например:

public ArrayList<? extends Question> getQuestions(QuestionType type) { 
    ... 
} 
2

Изменить метод подписи:

public ArrayList<? extends Question> getQuestions(QuestionType type) 

На стороне записки, вы можете просто создать EnumMap для отображения списков вместо того, чтобы делать switch каждый раз.

+1

+1 для упоминания 'EnumMap' – awksp

1

Правильный прототип public <T extends Question> ArrayList<T> getQuestions(QuestionType type) или public ArrayList<? extends Question> getQuestions(QuestionType type)

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