【问题标题】:java abstract class with generics and inheritance : Bound mismatch具有泛型和继承的java抽象类:绑定不匹配
【发布时间】:2014-10-05 13:35:32
【问题描述】:

我有 2 个操作泛型的抽象类和 1 个使用泛型的工厂。父级独立于trips 对象和分解代码。儿子只是基于旅行。

//parent
public abstract class AbstractPurchaseExtractor<//
BINDING_CLASS extends ForPnrHandling, //
PURCHASE extends AbstractServicePurchase<?, PRICING, RECEIPT, ITEM, COUPON>, //
PRICING extends PricingDefault, //
RECEIPT extends ReceiptDefault, //
ITEM extends AbstractServiceItem<PURCHASE, COUPON>, //
COUPON extends CouponDefault> //
    implements IPurchaseExtractor<BINDING_CLASS, PURCHASE, PRICING, RECEIPT, ITEM,     COUPON>
...






//son
public abstract class AbstractTripBasedPurchaseExtractor<//
BINDING_CLASS extends ForPnrHandling, //
TRIP_PURCHASE extends AbstractTripBasedPurchase<?, PRICING, RECEIPT, TRIP_BASED_ITEM,         TRIP_BASED_COUPON> , //
PRICING extends PricingDefault, //
RECEIPT extends ReceiptDefault, //
TRIP_BASED_ITEM extends  AbstractTripBasedItem<TRIP_PURCHASE, TRIP_BASED_COUPON, ?>, //
TRIP_BASED_COUPON extends  TripBasedCouponDefault> //
        extends AbstractPurchaseExtractor<BINDING_CLASS, TRIP_PURCHASE, PRICING,     RECEIPT,     TRIP_BASED_ITEM, TRIP_BASED_COUPON> //
{

@Autowired
private AbstractTripBasedPurchaseFactory<TRIP_PURCHASE, PRICING, RECEIPT, TRIP_BASED_ITEM, TRIP_BASED_COUPON> abstractTripBasedPurchaseFactory;
  ...





//factory
public abstract class AbstractTripBasedPurchaseFactory<PURCHASE extends     AbstractTripBasedPurchase<?, PRICING, RECEIPT, ITEM, COUPON>,
                                                   PRICING extends PricingDefault,
                                                   RECEIPT extends ReceiptDefault,
                                                   ITEM extends AbstractTripBasedItem<?     extends AbstractTripBasedPurchase<?, PRICING, RECEIPT, ITEM, COUPON>, COUPON, ?>,
                                                   COUPON extends     TripBasedCouponDefault>
   extends AbstractPurchaseFactory<PURCHASE, PRICING, RECEIPT, ITEM>
{

我在 Eclipse 上遇到了 AbstractTripBasedPurchaseExtractor 第 9 行的错误: 有界不匹配:类型 TRIP_PURCHASE 不是有界参数的有效替代品

<PURCHASE extends AbstractServicePurchase<?,PRICING, RECEIPT, ITEM,COUPON>> 

类型

AbstractPurchaseExtractor<BINDING_CLASS,PURCHASE,PRICING, RECEIPT, ITEM,COUPON>

这里:扩展 AbstractPurchaseExtractor 'TRIP_PURCHASE ...

在子类上使用扩展,我需要为 TRIP_PURCHASE 使用扩展 AbstractServicePurchase 的东西。实际上 AbstractTripBasedPurchase 扩展了 AbstractServicePurchase。那么为什么会报错呢?

如果我按照 Eclipse 的预期将 AbstractTripBasedPurchase 替换为 AbstractServicePurchase,它当然可以编译,但我不能在子类上使用我的行程工厂。

【问题讨论】:

  • 泛型类型太多了,我现在无法理解,但乍一看,其中有一个通配符 (?) 可能不是很好。如果用类型占位符替换它会有帮助吗?
  • 不,我不需要在这里替换通配符(?)没有问题。问题是extends 期望我声明一个AbstractServicePurchase 类,但我传递了一个名为AbstractTripBasedPurchase 的类的儿子。奇怪的是不接受它,就像继承不起作用
  • 您能否将其简化为仍然存在问题的最小示例?
  • 这听起来很奇怪,因为它是用 Maven 编译的,但是我的 java 文件在 Eclipse Kepler 上是红色的错误... Eclipse bug ???
  • 母牛的圣母!

标签: java generics inheritance abstract


【解决方案1】:

最大简化相同。

有效。

public interface IGeneric<OBJECT> {
    public void test(OBJECT o);
}


public abstract class Parent<OBJECT extends AbstractProduct> implements IGeneric<OBJECT> {       
}

public abstract class Son<PRODUCT extends Trip> extends Parent<PRODUCT> {
    IService<PRODUCT> service;   
}

public abstract class AbstractProduct {  
}

public class Trip extends AbstractProduct{ 
}

 public interface IService<TRIP extends Trip> { 
}

【讨论】:

  • 我在第一个示例中使用的类是基于 API 的,存在一些不一致的层次结构问题。不幸的是,我猜 Eclipse 在我的案例中没有看到很好的继承
猜你喜欢
  • 2023-04-03
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
相关资源
最近更新 更多