gpt4 book ai didi

java - 是否可以覆盖通用函数?

转载 作者:行者123 更新时间:2023-11-29 08:19:13 27 4
gpt4 key购买 nike

是否可以覆盖下面代码片段中所示的泛化函数?

interface A {
}

interface B extends A {
}


abstract class C {
protected abstract <T extends A> void abc(T xyz);
}

class D extends C {
@Override
protected void abc(B xyz) {
// doesn't compile
// The method abc(B) of type D must override or implement a supertype method
}
}

谢谢

最佳答案

使用您的代码,D 的一个实例是 C 的实例,因此必须接受 A 的任何子类作为其 abc() 的参数方法。你想要的是一个只接受特定子类的实例。您需要生成 C (而不仅仅是 C#abc() )。然后你可以制作D扩展C<B> ,像这样:

interface A {
}

interface B extends A {
}

abstract class C<T extends A> {
protected abstract void abc(T xyz);
}

class D extends C<B> {
@Override
protected void abc(B xyz) {
// Compiles
}
}

不能仅泛化方法的证明:

interface A {
}

interface B extends A {
public void def();
}

abstract class C {
protected abstract <T extends A> void abc(T xyz);
}

class D extends C {
@Override
protected void abc(B xyz) {
xyz.def();
}

public static void main(String[] args) {
D d = new D();
d.abc(new B(){}); // Invokes def() on a B, OK
C c = (C) d; // Cast to a C, OK
c.abc(new A(){}); // C#abc() applies to an A, but tries to invoke
// a's def(), which it lacks
}
}

关于java - 是否可以覆盖通用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651425/

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