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> { }