首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在这个Java泛型方法定义上会有警告?

为什么在这个Java泛型方法定义上会有警告?
EN

Stack Overflow用户
提问于 2010-11-29 23:42:43
回答 2查看 1.5K关注 0票数 9

我注意到,如果我在方法签名上使用泛型来完成类似于协变量返回类型的事情,它的工作方式就像我想的那样,除非它会生成一个警告:

代码语言:javascript
复制
interface Car {
    <T extends Car> T getCar();
}

class MazdaRX8 implements Car {
    public MazdaRX8 getCar() { // "Unchecked overriding" warning
        return this;
    }
}

使用上面的代码,我的IDE给出了警告:“未选中覆盖:返回类型需要未检查的转换。

这个警告是什么意思?

这对我来说没有什么意义,谷歌也没有提出任何有用的东西。为什么这不能作为以下接口的无警告替代(这也是免费的,因为Java允许协变返回类型)?

代码语言:javascript
复制
interface Car {
    Car getCar();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-29 23:46:16

您已经使该方法成为通用方法,因此调用方可以说应该返回哪种类型(因为调用方可以指定类型参数)。这是一个很难在Java中正确实现的接口,在Java中,您无法在执行时找到类型参数。

例如,考虑以下几点:

代码语言:javascript
复制
Car mazda = new MazdaRX8();        
FordGalaxy galaxy = mazda.<FordGalaxy>getCar();

就界面而言这是完全合法的..。但这显然是行不通的。

为什么接口不是泛型的而不是方法呢?那么MazdaRX8将实现Car<MazdaRX8>

代码语言:javascript
复制
interface Car<T extends Car> {
    T getCar();
}

class MazdaRX8 implements Car<MazdaRX8 > {
    public MazdaRX8 getCar() {
        return this;
    }
}
票数 22
EN

Stack Overflow用户

发布于 2010-11-29 23:53:15

简短的回答:它不是那样工作的,而且做你提议的事情是非常危险的,因为编译器没有办法推断出什么应该是“正确的”。泛型方法通常有通过方法参数传递给它们的类型,在这里您不会在参数化中传递任何内容,因此T可以是扩展Car的任何东西。

很长的答案:看看这个question得到的答案。

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

https://stackoverflow.com/questions/4309229

复制
相关文章

相似问题

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