我有一个带有通用映射参数的通用方法。我想覆盖它并使用具体的子类型,但没有强制转换,我无法返回我的子类型
public interface GarrageSimple {
<T extends Car> T getCar(Map<String, T> c);
}
实现如下,错误为:不兼容的类型。必需:T找到:宝马
public class GarrageSimpleImpl implements GarrageSimple {
@Override
public <T extends Car> T getCar(Map<String, T> c) {
return new Bmw();
}
}
实际上,宝马是汽车的一个子类,意思是T的一种。当我像 * return (T(new Bmw((; * 一样投射它时,它会发出警告,即未选中将 BMW 转换为 T
我知道这是因为我在方法签名是通用时冒险返回具体的子类,但是我如何更改我的方法以使其具体而不破坏覆盖签名? 如果可以的话,在这种情况下,它应该按预期工作。
PS:我不想让我的类泛型,我只需要更改我的方法签名以使其在实现过程中具体化。
谢谢
不,这是无效的。如果有人使用GarrageSimpleImpl引用来调用它,会发生什么 扩展车?泛型都是关于编译时安全性的,这就是你收到此错误的原因。
但你可以这样做,
public interface GarrageSimple<T extends Car> {
T getCar(Map<String, T> c);
}
public class GarrageSimpleImpl implements GarrageSimple<Bmw> {
@Override
public Bmw getCar(Map<String, Bmw> c) {
return new Bmw();
}
}
你不能。泛型方法(声明自己的类型参数的方法(意味着无论类型参数是什么(此处T
(是什么,您的方法都必须工作。该方法无法选择要使用的T
。调用者可以调用你的方法,T
是T
范围内的任何内容,并且你的方法必须与任何T
正常工作,没有选择。
子类重写超类中的方法意味着子类方法必须是重写方法的有效替代项,这意味着它必须在可以调用重写方法的所有情况下工作。由于被覆盖的方法很泛型,并且适用于任何T
,因此覆盖它的子类方法也必须适用于任何T
。您的方法不适用于任何T
- 它对任何未Bmw
T
都失败。