>我有一个扩展类 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{...}
提前致谢
安德里亚
棘手且难以解释。
- 类型参数在泛型
AbstractPopulatingConverter
中定义。 - 类型参数在
CustomerReviewConverter
中具体化。 - 然后,您尝试在
MyCustomerReviewConverter
中再次使具体化类型参数泛型。
这是行不通的。您正在尝试使用具有不同方法签名(不同参数类型)的方法重写方法。
可以重写该方法的唯一方法如下:
@Override
public void populate(final CustomerReviewModel source,
final ReviewData target) { /* ... */ }
但是,您可以重载它,而不是重写该方法:
public void populate(final MyCustomerReviewModel source,
final MyReviewData target) { /* ... */ }
如果在具有 MyCustomerReviewModel
和 MyReviewData
参数的 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)
.