使用泛型返回多个类型

时间:2014-06-16 20:23:28

标签: java android generics arraylist return-type

我目前正在尝试重构我的一些代码,并且偶然发现了一个我之前在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

有些人可以向我解释如何对实现此任务的方法进行原型设计吗?

感谢您的理解和帮助。

3 个答案:

答案 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)