我注意到,如果我使用泛型方法签名来完成类似于共同类型的返回类型的东西,它的工作原理就像我想,除了它会产生一个警告:
interface Car { <T extends Car> T getCar(); } class MazdaRX8 implements Car { public MazdaRX8 getCar() { // "Unchecked overriding" warning return this; } }
使用上面的代码,我的IDE发出警告:“未选中覆盖:返回类型需要未经检查的转换.找到:’MazdaRX8′,需要’T’
这个警告是什么意思?
对我来说没什么意义,Google没有提出任何有用的东西.为什么这不用作以下界面的无警告的替换(这也是免费的,因为Java允许使用类似的返回类型)?
interface Car { Car getCar(); }
解决方法
你已经使该方法泛型,所以调用者得到说应该返回什么类型(因为调用者可以指定type参数).这是一个很好的界面,可以在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; } }