【发布时间】:2018-08-28 12:32:58
【问题描述】:
在泛型类上使用协方差时,我无法正确定义泛型方法,如果这完全符合我的意图的话。我最好通过例子来解释手头的问题。
假设我们有以下汽车接口设置
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<?> 不匹配。
谁能为这个问题提供一个可行的解决方案?
【问题讨论】:
-
如果燃料是汽车的固有属性,汽车厂商只销售一种类型的汽车,那么汽车厂商只销售一种类型的汽车和一种燃料。要么将燃料移动到供应商界面;要么或将汽车类型移到方法上。
标签: java generics inheritance covariance