我注意到,如果我使用泛型方法签名来完成类似于共同类型的返回类型的东西,它的工作原理就像我想,除了它会产生一个警告:
- 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;
- }
- }