Можно ли переопределить обобщенную функцию? - PullRequest
1 голос
/ 30 октября 2009

Можно ли переопределить обобщенную функцию, как показано в фрагменте кода ниже?

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 ]

6 голосов
/ 30 октября 2009

В вашем коде экземпляр 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
    }
}
0 голосов
/ 30 октября 2009

Ваш класс D должен расширяться C<B>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...