gpt4 book ai didi

java - 使用抽象类中的通用参数重写方法

转载 作者:行者123 更新时间:2023-12-01 11:05:50 24 4
gpt4 key购买 nike

我无法编译需要重写抽象类父类(super class)型中的方法的方法,该抽象类父类(super class)型对其中一个参数使用泛型。编译器提示扩展类的 setRef() 方法没有重写父类(super class)型中的方法。

父抽象类:

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<ChildClass>或子类型,所以这并不完美。如何让我的扩展类只允许 ChildClass 或其子类型用于 setRef() 方法的 newRef 参数?我的部分困惑是 ChildClass 的 getRef() 返回值可以很好地处理通用类型,而 setRef() 参数上的相同“签名”无法编译。帮助?谢谢!

最佳答案

setRef 的问题是您可以访问 ChildClass 的实例通过 AbsClass<? extends Interf> 类型的变量因此 setRef 的参数类型看起来像 <M extends AbsClass<? extends Interf>>这又可以是任何 M但这也不匹配 <M extends AbsClass<Q>>Q已定义为 InterfImpl在你的情况下。

您可以更改ChildClass对此:

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

但这仍然允许任何 M你不能只使用 Ref<ChildClass>因为我上面所说的,即编译器不会知道 Ref<ChildClass>如果您使用 AbsClass<InterfImpl> 类型的变量甚至AbsClass<? extends InterfImpl> .

一种仅允许 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) { }
}

关于java - 使用抽象类中的通用参数重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32962471/

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