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(数据列表);
...
所以我的问题是:

原因:

  • 第一个方法不编译吗
  • 在第二个方法中是否调用父方法而不是子方法,以及如何修复它
  • 根据您给我们的信息,调用父方法是不可能的。您键入了methodname(
    保存
    ),或者您的调用代码在此处有问题

    注意,在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>();