Java 泛型类与泛型方法的协方差

Java 泛型类与泛型方法的协方差,java,generics,inheritance,covariance,Java,Generics,Inheritance,Covariance,在泛型类上使用协方差时,我无法正确定义泛型方法,如果这是我想要的方式的话。我最好用例子来解释眼前的问题 假设我们有以下汽车接口设置 interface Car { ... } interface SportsCar extends Car { ... } 以及针对返回Sale对象的汽车供应商的此类通用接口 interface CarVendor<C extends Car> { Sale<C> sell(C car); } interface Sports

在泛型类上使用协方差时,我无法正确定义泛型方法,如果这是我想要的方式的话。我最好用例子来解释眼前的问题

假设我们有以下汽车接口设置

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);
}
sportscavendor
显然没有编译,因为签名
sell(SportsCar)
与预期类型
SportsCar
不匹配


有人能为这个问题提供一个可行的解决方案吗?

根据您目前提供的内容,我看不出为什么大多数接口和类都应该是泛型的,我也看到了为什么大多数接口和类不应该是泛型的

interface CarVendor<C extends Car> {    
    Sale sell(C car);
}

interface SportsCarVendor extends CarVendor<SportsCar> {    
    @Override
    Sale sell(SportsCar car);
}
FuelType
听起来应该是
Car
的属性,而不是类型参数。也许它可以声明为枚举,具体取决于您的具体需求

enum FuelType {
    PETROL,
    DIESEL;
}

public class Car {
    private FuelType fuelType;
    // rest of implementation
}
类似地,
Car
应该是
Sale
的属性,而不是类型参数

public class Sale {
    private Car sold;
    // rest of implementation
}
您可能仍然需要
sportscavendor
成为泛型,以便缩小实现类可以出售的
car
的类型,但是
Sale
方法返回的
sell
仍然不需要是泛型的

interface CarVendor<C extends Car> {    
    Sale sell(C car);
}

interface SportsCarVendor extends CarVendor<SportsCar> {    
    @Override
    Sale sell(SportsCar car);
}

如果您真的必须为每个汽车供应商单独处理燃料类型(可能是税务原因?),以下是您如何定义汽车供应商以允许:

interface CarVendor<F extends FuelType, C extends Car<F>> {
    Sale<C> sell(C param);
}

interface SportsCarVendor <F extends FuelType> extends CarVendor<F, SportsCar<F>> { }
接口卡文多{
销售(C参数);
}
接口SportsCarVendor扩展了CarVendor{}
现在来看具体的实现:

class SportsCarVendorDiesel implements SportsCarVendor<DieselFuel> {
    @Override
    public Sale<SportsCar<DieselFuel>> sell(SportsCar<DieselFuel> param) {
        return null;
    }
}

class SportsCarVendorGas implements SportsCarVendor<GasolineFuel> {
    @Override
    public Sale<SportsCar<GasolineFuel>> sell(SportsCar<GasolineFuel> param) {
        return null;
    }
}
类SportsCarVendorDiesel实现SportsCarVendor{
@凌驾
公开销售(跑车参数){
返回null;
}
}
类SportsCarVendorGas实现SportsCarVendor{
@凌驾
公开销售(跑车参数){
返回null;
}
}
我使用的其他类如下所示:

interface FuelType {
    double burnRate();
}

class DieselFuel implements FuelType {

    @Override
    public double burnRate() {
        return 0;
    }
}

class GasolineFuel implements FuelType {

    @Override
    public double burnRate() {
        return 0;
    }
}

interface Car<F extends FuelType> { }
interface SportsCar<F extends FuelType> extends Car<F> { }

class Sale<C> { }
接口类型{
双燃速();
}
类DieselFuel实现FuelType{
@凌驾
公共双燃速(){
返回0;
}
}
类汽油燃料实现燃料类型{
@凌驾
公共双燃速(){
返回0;
}
}
接口卡{}
接口跑车扩展汽车{}
类别销售{}

如果燃料是汽车的固有属性,而汽车销售商只销售一种类型的汽车,那么汽车销售商只销售一种带有一种燃料的汽车。将燃料移动到供应商界面上;或者将车辆类型移动到方法上。
class SportsCarVendorDiesel implements SportsCarVendor<DieselFuel> {
    @Override
    public Sale<SportsCar<DieselFuel>> sell(SportsCar<DieselFuel> param) {
        return null;
    }
}

class SportsCarVendorGas implements SportsCarVendor<GasolineFuel> {
    @Override
    public Sale<SportsCar<GasolineFuel>> sell(SportsCar<GasolineFuel> param) {
        return null;
    }
}
interface FuelType {
    double burnRate();
}

class DieselFuel implements FuelType {

    @Override
    public double burnRate() {
        return 0;
    }
}

class GasolineFuel implements FuelType {

    @Override
    public double burnRate() {
        return 0;
    }
}

interface Car<F extends FuelType> { }
interface SportsCar<F extends FuelType> extends Car<F> { }

class Sale<C> { }