当前位置: 首页 > 知识库问答 >
问题:

使用抽象类中的泛型参数重写方法

淳于慎之
2023-03-14

我无法编译一个需要从抽象类超类型重写方法的方法,该类超类型使用泛型作为其中一个参数。编译器抱怨扩展类的setRef()方法没有重写超类型中的方法。

父摘要类:

public abstract class AbsClass<Q extends Interf> {
    public abstract Ref<? extends AbsClass<Q>> getRef();
    public abstract <M extends AbsClass<Q>> void setRef(Ref<M> newRef);
}

参考是:

public interface Ref<M extends AbsClass<? extends Interf>> { }

而Interf是:

public interface Interf { }

扩展子类(setRef()不编译):

public class ChildClass extends AbsClass<InterfImpl> {
    @Override
    public Ref<ChildClass> getRef() {
        return null;
    }

    @Override
    public <M extends ChildClass> void setRef(Ref<M> newRef) {
        return null;
    }
}

我也尝试过使用通配符,但收到了相同的错误。使用通配符时,抽象类“setRef()是:

public abstract void setRef(Ref<? extends AbsClass<Q>> newRef);

扩展类setRef()是:

public void setRef(Ref<ChildClass> newRef)

甚至:

public void setRef(Ref<? extends ChildClass> newRef)



我能让它编译的唯一方法是,如果扩展类“setRef()使用抽象类”类型:

public <M extends AbsClass<Interf>> void setRef(Ref<M> newRef)

但是我想将newRef参数的类型限制为Ref


共有2个答案

尉迟墨竹
2023-03-14

由于在类中,您将收到一个错误。setRef(),您的参数类型为Ref

但是在你的儿童课上。setRef()该参数的类型为Ref

对于重写,子类在方法中应该具有与其父类相同的类型化参数(在使用泛型时类型擦除之前)。

罗俭
2023-03-14

setRef的问题是,您可以通过类型为AbsClass的变量访问ChildClass的实例

您可以将ChildClass更改为:

public <M extends AbsClass<InterfImpl>> void setRef(Ref<M> newRef)

但是这仍然允许任何M,并且您不能仅仅使用Ref

只允许ChildClass参数的一种方法是在泛型类型中也使用ChildClass,例如:

public abstract class AbsClass<Q extends Interf, M extends AbsClass<Q, M>> {
  public abstract Ref<M> getRef();
  public abstract void setRef(Ref<M> newRef);
}

public class ChildClass extends AbsClass<InterfImpl, ChildClass> {

  public Ref<ChildClass> getRef() { return null; }

  public void setRef(Ref<ChildClass> newRef) { }
}

 类似资料:
  • 所以,问题是:我有一个抽象基类(),它有一个抽象成员方法()。方法返回布尔值,并应检查是否相等,但“相等”在子类中可能有不同的解释,因此我不重写或。因为它测试是否与另一个与其类型相同的对象相等,所以签名如下所示: 现在,当我试图在类中重写它时,假设“”,我不能使用作为参数的类型。我知道一般情况下这样做的原因和添加类型界限的建议,但是事情变得更加复杂,因为参数类型是它自己的类。 有没有什么平滑的方法

  • 问题内容: 我有一个抽象类 Monitor.java ,它由类 EmailMonitor.java 子类 化 。 方法: 在 Monitor.java中 定义,并且必须在 EmailMonitor.java中 覆盖。 我目前在 EmailMonitor.java中 重写了如下方法: 但是,这会产生编译时错误: 是的子类,因此(至少在我看来)以这种方式覆盖它是很有意义的。看到编译器对我的逻辑不满意,

  • 问题内容: 我有一个像这样的课程: 但是编译器说:。 我如何获得的课程? 问题答案: 绝对有可能将其提取出来,因为它不是在运行时定义的,而是在编译时由定义的。 这是一个启动示例,您可以如何在抽象类的构造函数中提取所需的泛型超类型,同时考虑子类的层次结构(以及在无需显式提供类型的情况下将其应用于泛型方法的实际用例)):

  • 我不熟悉泛型。我有一个抽象类(1)和一个抽象方法。我有另一个抽象类(2)和一些抽象方法,我希望在一些DTO(3,4)中共享这些抽象方法。我想要一个(1)的具体扩展来处理任何扩展(2)的东西。 1. 扩展StagingError的两个类:3.

  • 我有这样的抽象类: 我还有一个扩展抽象的类:

  • 我正在做一个体验,尝试用以下方式重写泛型类的方法: 为什么我不能?编译错误是 yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence 如果我注释“第1行”,我可以编译代