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

Nic*_*ole 10 java generics compiler-warnings

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

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

class MazdaRX8 implements Car {
    public MazdaRX8 getCar() { // "Unchecked overriding" warning
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

这个警告意味着什么?

 

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

interface Car {
    Car getCar();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 22

你已经使方法成为通用的,所以调用者可以说出应该返回什么类型(因为调用者可以指定类型参数).这是在Java中正确实现的非常难的接口,在执行时您无法找到类型参数.

例如,考虑一下:

Car mazda = new MazdaRX8();        
FordGalaxy galaxy = mazda.<FordGalaxy>getCar();
Run Code Online (Sandbox Code Playgroud)

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

接口不是通用的,而不是方法的任何原因?然后MazdaRX8将实施Car<MazdaRX8>:

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

class MazdaRX8 implements Car<MazdaRX8 > {
    public MazdaRX8 getCar() {
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)