是否有可能覆盖一般的功能?

时间:2009-10-30 18:07:31

标签: java generics inheritance

是否可以覆盖一般的功能,如下面的代码片段所示?

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
    }
}

由于

2 个答案:

答案 0 :(得分:6)

使用您的代码,D的实例是C的实例,因此必须接受的任何子类作为其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
    }
}

答案 1 :(得分:-1)

您的班级D应该延长C<B>