如果我打算在泛型类上使用协变,我就无法正确定义泛型方法。为了更好地解释问题,请看以下示例。
假设我们有以下汽车接口设置:
interface Car { ... }
interface SportsCar extends Car { ... }
还有针对汽车供应商返回 Sale
对象的通用接口。
interface CarVendor<C extends Car> {
Sale<C> sell(C car);
}
interface SportsCarVendor extends CarVendor<SportsCar> {
@Override
Sale<SportsCar> sell(SportsCar car);
}
现在假设我们希望我们的汽车是通用的,例如燃料类型方面:
interface Car<F extends FuelType> { ... }
interface SportsCar<F extends FuelType> extends Car<F> { ... }
class PetrolSportsCar extends SportsCar<Petrol> { ... }
class DieselSportsCar extends SportsCar<Diesel> { ... }
如果我们希望我们的供应商接口能够销售任何类型的燃料汽车,那么在重新定义它们时就会遇到问题。一种通用的方法似乎是答案,但是由于通用的 Car<?>
是在类上定义的,因此我无法正确地定义它,而通用的 FuelType
应该在方法上定义。以此来理解:
interface CarVendor<C extends Car<?>> {
<F extends FuelType> Sale<Car<F>> sell(Car<F> param);
}
interface SportsCarVendor extends CarVendor<SportsCar<?>> {
@Override
<F extends FuelType> Sale<SportsCar<F>> sell(SportsCar<F> param);
}
SportsCarVendor
显然无法编译,因为签名sell(SportsCar<F>)
与期望类型SportsCar<?>
不匹配。
有人能提供一个可行的解决方案吗?