我有一个扩展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{...}
提前致谢
安德烈
答案 0 :(得分:2)
棘手且难以解释。
AbstractPopulatingConverter
。CustomerReviewConverter
。MyCustomerReviewConverter
。那只是行不通。您正尝试使用具有不同方法签名(不同参数类型)的方法覆盖方法。
您可以覆盖该方法的唯一方法如下:
@Override
public void populate(final CustomerReviewModel source,
final ReviewData target) { /* ... */ }
但是,除了覆盖方法,您可以重载:
public void populate(final MyCustomerReviewModel source,
final MyReviewData target) { /* ... */ }
如果在populate()
类型的对象上调用MyCustomerReviewConverter
方法且MyCustomerReviewModel
和MyReviewData
参数,则编译器将选择最具体的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)
。