我注意到,如果我在方法签名上使用泛型来完成类似于协变量返回类型的事情,它的工作方式就像我想的那样,除非它会生成一个警告:
interface Car {
<T extends Car> T getCar();
}
class MazdaRX8 implements Car {
public MazdaRX8 getCar() { // "Unchecked overriding" warning
return this;
}
}使用上面的代码,我的IDE给出了警告:“未选中覆盖:返回类型需要未检查的转换。
这个警告是什么意思?
这对我来说没有什么意义,谷歌也没有提出任何有用的东西。为什么这不能作为以下接口的无警告替代(这也是免费的,因为Java允许协变返回类型)?
interface Car {
Car getCar();
}发布于 2010-11-29 23:46:16
您已经使该方法成为通用方法,因此调用方可以说应该返回哪种类型(因为调用方可以指定类型参数)。这是一个很难在Java中正确实现的接口,在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;
}
}发布于 2010-11-29 23:53:15
简短的回答:它不是那样工作的,而且做你提议的事情是非常危险的,因为编译器没有办法推断出什么应该是“正确的”。泛型方法通常有通过方法参数传递给它们的类型,在这里您不会在参数化中传递任何内容,因此T可以是扩展Car的任何东西。
很长的答案:看看这个question得到的答案。
https://stackoverflow.com/questions/4309229
复制相似问题