错误覆盖扩展泛型类的类的方法

时间:2015-04-27 09:06:05

标签: java generics

我有一个扩展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

出了什么问题?

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

MyReviewData extends ReviewData{...}

提前致谢

安德烈

3 个答案:

答案 0 :(得分:2)

棘手且难以解释。

  1. 类型参数在通用AbstractPopulatingConverter
  2. 中定义
  3. 类型参数在CustomerReviewConverter
  4. 中具体化
  5. 然后,您尝试在MyCustomerReviewConverter
  6. 中再次使具体化类型参数通用

    那只是行不通。您正尝试使用具有不同方法签名(不同参数类型)的方法覆盖方法。

    您可以覆盖该方法的唯一方法如下:

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

    但是,除了覆盖方法,您可以重载

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

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

答案 1 :(得分: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在答案中解释得比我好。

答案 2 :(得分:0)

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