Java泛型中的重写
我在抽象父类中有一个泛型方法,我想在具体子类中重写它: 父类:Java泛型中的重写,java,generics,overriding,Java,Generics,Overriding,我在抽象父类中有一个泛型方法,我想在具体子类中重写它: 父类: public abstract class AbstractParentDataAccess<S extends AbstractParentDataModel> { ... public void save(Collection<? extends S> collection) {...} ... } public class ConcreteDataAccess extends Abs
public abstract class AbstractParentDataAccess<S extends AbstractParentDataModel>
{
...
public void save(Collection<? extends S> collection) {...}
...
}
public class ConcreteDataAccess extends AbstractParentDataAccess<ConcreteDataModel>
{
...
// this does not compile
@Override
public void save(Collection<ConcreteDataModel> collection) {...}
// this compiles but never gets called, the parent method is being called instead
@Override
public void save(Collection<? extends ConcreteDataModel> collection) {...}
...
}
下面是我如何调用save方法的:
...
@Autowired
private ConcreteDataAccess concreteDataAccess;
....
List<ConcreteDataModel> dataList = DataService.getDataList();
concreteDataAccess.save(dataList);
...
。。。
@自动连线
私有数据访问;
....
List dataList=DataService.getDataList();
concreteDataAccess.save(数据列表);
...
所以我的问题是:
原因:
保存
),或者您的调用代码在此处有问题
注意,在VM级别,泛型不存在;这两种方法都有完全相同的JVM签名:save(Ljava/util/Collection;)V
-即使泛型非常不正常,但就VM而言,它是相同的方法,因此,子类中的save
会覆盖父类中的方法
List
在此不编译,因为集合请显示您是如何创建实例和调用方法的。1。它无法编译,因为它不是超类中方法的重写等价物。@BakriBitar请显示代码:a。你正在做的事情导致了你意想不到的结果,如果你不给我们展示,我们就不能说那是什么。您有S=ConcreteDataModel
,并且您正在接受List@MarcosVasconcelos:它们不是等价物Collection
允许您向其添加S
的任何实例<代码>集合
...
@Autowired
private ConcreteDataAccess concreteDataAccess;
....
List<ConcreteDataModel> dataList = DataService.getDataList();
concreteDataAccess.save(dataList);
...
List<ConcreteDataModel> x = new ArrayList<SubTypeOfConcreteDataModel>();
List<? extends ConcreteDataModel> x = new ArrayList<SubTypeOfConcreteDataModel>();