错误重写扩展泛型类的类的方法



>我有一个扩展类 B 的类 A,类 B 扩展了一个泛型类

我的A类是:

public class MyCustomerReviewConverter<SOURCE extends CustomerReviewModel, TARGET extends ReviewData> extends CustomerReviewConverter{
    @Override
    public void populate(final SOURCE source, final TARGET target) {.....}

扩展的 B 类是

public class CustomerReviewConverter extends AbstractPopulatingConverter<CustomerReviewModel, ReviewData>{
    @Override
    public void populate(final CustomerReviewModel source, final ReviewData target)
    {..........}

但是我收到错误

 Name clash: The method populate(SOURCE, TARGET) of type MyCustomerReviewConverter<SOURCE,TARGET> has the same erasure as populate(CustomerReviewModel, ReviewData) of type 
     CustomerReviewConverter but does not override it

怎么了?

作为填充方法中的第二个参数,我必须传递一个类

MyReviewData extends ReviewData{...}

提前致谢

安德里亚

棘手且难以解释。

  1. 类型参数在泛型AbstractPopulatingConverter中定义。
  2. 类型参数在 CustomerReviewConverter 中具体化。
  3. 然后,您尝试在 MyCustomerReviewConverter 中再次使具体化类型参数泛型。

这是行不通的。您正在尝试使用具有不同方法签名(不同参数类型)的方法重写方法。

可以重写该方法的唯一方法如下:

@Override
public void populate(final CustomerReviewModel source,
        final ReviewData target) { /* ... */ }

但是,您可以重载它,而不是重写该方法:

public void populate(final MyCustomerReviewModel source,
        final MyReviewData target) { /* ... */ }

如果在具有 MyCustomerReviewModelMyReviewData 参数的 MyCustomerReviewConverter 类型的对象上调用 populate() 方法,编译器选择最具体的populate方法,即重载方法。

<SOURCE, TARGET>的泛型类型的类型已经由 B 具体化为 <CustomerReviewModel, ReviewData> 。如果你想扩展B,你的A应该只是:

public class MyCustomerReviewConverter extends CustomerReviewConverter {
    @Override
    public void populate(final CustomerReviewModel source, final ReviewData target) 
        { ... }
}

否则,您需要直接扩展 AbstractPopulatingConverter,并可能编写一个委托来执行 B 中的共享逻辑,以便您可以在其他地方重用它。

@Robby Cornelissen在他的回答中解释得比我好。

您应该扩展CustomerReviewConverter<SOURCE, TARGET>(可能,您尚未将其定义添加到问题中)而不是原始类型。然后你需要覆盖public void populate(SOURCE source, TARGET target).

最新更新