gpt4 book ai didi

java - Java 泛型中的重写

转载 作者:行者123 更新时间:2023-12-02 09:41:01 24 4
gpt4 key购买 nike

我在抽象父类中有一个通用方法,我想在具体子类中覆盖它:

父类:

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) {...}
...

}

ConcreteDataModel类继承自AbstractParentDataModel:

public class ConcreteDataModel extends AbstractParentDataModel {...} 

这是我调用保存方法的方法:

...
@Autowired
private ConcreteDataAccess concreteDataAccess;
....
List<ConcreteDataModel> dataList = DataService.getDataList();
concreteDataAccess.save(dataList);
...

所以我的问题是:

为什么:

  1. 第一个方法不能编译吗?
  2. 在第二个方法中是否调用了父方法而不是子方法以及如何修复它?

最佳答案

鉴于您向我们提供的信息,调用父方法是不可能。您输入了错误的方法名称 ( save ),或者您的调用代码存在问题。

请注意,在 VM 级别,不存在泛型;两种方法具有完全相同的 JVM 签名:save(Ljava/util/Collection;)V - 即使泛型非常不正常,就虚拟机而言也是相同的方法,因此,save你的子类中的类会覆盖父类中的类。

List<ConcreteDataModel>此处无法编译,因为 Collection<? extends S>允许的类型多于 List<ConcreteDataModel>做。例如,这个:

List<ConcreteDataModel> x = new ArrayList<SubTypeOfConcreteDataModel>();

无法编译,但是这个:

List<? extends ConcreteDataModel> x = new ArrayList<SubTypeOfConcreteDataModel>();

是的。 (原因:您可以在 x.add(new ConcreteDataModel()); 上调用 List<ConcreteDataModel> ,将一些不是 SubTypeOfConcreteDataModel 的内容放入 SubTypeOfConcreteDataModel 列表中。请注意,您根本无法在 .add() 上调用 List<? extends WhateverYouWantToWriteHere> ,除非您通过从字面上看 null

关于java - Java 泛型中的重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57061585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com