首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理泛型方法中的特定类型将接受并返回相同的泛型类型。

处理泛型方法中的特定类型将接受并返回相同的泛型类型。
EN

Stack Overflow用户
提问于 2014-12-01 17:57:39
回答 2查看 42关注 0票数 0

我有一个泛型方法T foo(T),它根据参数的实际类型执行不同的操作。下面的例子说明了同样的问题。(有关我在代码中实际做了什么,请参见下面的描述。)

代码语言:javascript
复制
<T extends Number> T foo(T a) {
    if (a instanceof Integer) {
        return ((Integer) a) + 1;
    } else if (a instanceof Double) {
        return ((Double) a) + 1;
    } else {
        throw new IllegalArgumentException();
    }
}

这并不违反返回类型的要求,但javac不接受。问题是,例如,return ((Integer) a) + 1;只有在TInteger时才能执行,但是编译器不能(根据JLS)推断这一点,因此期望将T传递给return。那里的表达式类型为int,不能转换为T

是否有办法处理这种情况而不诉诸未经检查的演员?

实际上,我在代码中所做的是:在应用程序中,有一个通用接口,用于封装一些值。对于不同的值类型,该接口有不同的专门实现,我试图编写的方法应该动态地选择正确的实现。

EN

回答 2

Stack Overflow用户

发布于 2014-12-01 18:01:31

如果您在运行时对a进行类型检查,那么您就违背了泛型的观点。但是泛型无论如何都不适用于数学运算符,因为这些运算符处理原语,类型参数与引用类型一起工作。您的解决方案不适用于编译器,因为T在编译时可能是任何Number类型,所以编译器不能允许您在认为Integer可以是任何Number类型时返回它。

相反,我将重载两个非泛型foo方法--一个使用int,另一个使用double。这两个方法都不是通用的,每个方法都只执行自己的操作。

票数 3
EN

Stack Overflow用户

发布于 2014-12-01 18:02:23

这不是正确使用仿制药。你应该用方法过载代替

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27234302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档