繁体   English   中英

使用泛型返回不止一种类型

[英]Using generics to return more than one type

我目前正在尝试重构我的一些代码,并且偶然发现了与Java相关的Java以前没有使用过的功能。

我试图根据传递给方法的参数返回特定类型的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。 在Question类型的超类中不存在此方法。

// CLASS HIERARCHY
// SuperClass
Question

// SubClasses of Question
MultipleAnswerQuestion
MultipleChoiceQuestion
TrueFalseQuestion
MatchingQuestion
BlankQuestion

有人可以向我解释如何为实现此任务的方法建立原型吗?

感谢您的理解和帮助。

将方法签名更改为:

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

附带一提,您可能只想创建一个EnumMap即可映射列表,而不是每次都进行switch

您遇到的那些特殊编译错误可能是因为第二次声明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) {
    ...
}

正确的原型是public <T extends Question> ArrayList<T> getQuestions(QuestionType type)public ArrayList<? extends Question> getQuestions(QuestionType type) public ArrayList<? extends Question> getQuestions(QuestionType type)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM