继承泛型类的类重写方法出错

4
我有一个类A,它扩展了一个类B,而类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

什么问题?
在populate方法中,我必须传递一个类作为第二个参数。
MyReviewData extends ReviewData{...}

预先表示感谢
安德烈亚
3个回答

2

棘手而且难以解释。

  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) { /* ... */ }

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


1
泛型类型<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在他的答案中解释得比我更好。

0
你应该扩展CustomerReviewConverter<SOURCE, TARGET>(可能是因为你没有在问题中添加它的定义),而不是使用原始类型。然后,你需要重写public void populate(SOURCE source, TARGET target)方法。

CustomerReviewConverter是一个非泛型类,它扩展了一个泛型类......它在一个我无法修改的库中。 - Andrea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接