为什么对这个Java泛型方法定义有警告?

时间:2010-11-29 23:42:44

标签: java generics compiler-warnings

我注意到如果我在方法签名上使用泛型来完成类似于共同变量返回类型的东西,它就像我想的那样工作,除了它会产生警告:

interface Car {
    <T extends Car> T getCar();
}

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

使用上面的代码,我的IDE会发出警告:“未选中覆盖:返回类型需要未经检查的转换。发现:'MazdaRX8',需要'T'”

这个警告是什么意思?

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

interface Car {
    Car getCar();
}

2 个答案:

答案 0 :(得分:22)

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

例如,考虑一下:

Car mazda = new MazdaRX8();        
FordGalaxy galaxy = mazda.<FordGalaxy>getCar();

就接口而言,这是完全合法的......但显然不会起作用。

为什么接口不是通用的而不是方法?然后MazdaRX8将实施Car<MazdaRX8>

interface Car<T extends Car> {
    T getCar();
}

class MazdaRX8 implements Car<MazdaRX8 > {
    public MazdaRX8 getCar() {
        return this;
    }
}

答案 1 :(得分:1)

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

答案很长:请查看question以获得答案。