[英]Is it possible to override a generisized function?
是否可以覆蓋下面的代碼片段所示的泛型函數?
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
}
}
您的D
類應該擴展C<B>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.