我无法编译一个需要从抽象类超类型重写方法的方法,该类超类型使用泛型作为其中一个参数。编译器抱怨扩展类的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
由于在类中,您将收到一个错误。setRef()
,您的参数类型为Ref
但是在你的
儿童课上。setRef()
该参数的类型为Ref
对于重写,子类在方法中应该具有与其父类相同的类型化参数(在使用泛型时类型擦除之前)。
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行”,我可以编译代