我目前正在尝试重构我的一些代码,并且偶然发现了一个我之前在Java中与Generics相关的功能。
我试图根据传递给方法的参数返回特定类型的ArrayList<?>
。参数接受一个Enumeration,它指定所需的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。此方法不存在于问题类型的超类中。
// CLASS HIERARCHY
// SuperClass
Question
// SubClasses of Question
MultipleAnswerQuestion
MultipleChoiceQuestion
TrueFalseQuestion
MatchingQuestion
BlankQuestion
有些人可以向我解释如何对实现此任务的方法进行原型设计吗?
感谢您的理解和帮助。
答案 0 :(得分:2)
将您的方法签名更改为:
public ArrayList<? extends Question> getQuestions(QuestionType type)
在旁注中,您可能只想创建EnumMap
来映射列表,而不是每次都执行switch
。
答案 1 :(得分: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 :(得分:1)
正确的原型是public <T extends Question> ArrayList<T> getQuestions(QuestionType type)
或public ArrayList<? extends Question> getQuestions(QuestionType type)