是否可以覆盖下面代码片段中所示的泛化函数?
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/