Java-дженерики и наследование

у меня есть следующие абстрактные классы:

public abstract class AbSuperClass1<K,S> {
    //class definition
}

и:

public abstract class AbSuperClass2<K,S> {
    public abstract <Q extends AbSuperClass1<K,S>> void method(Q arg);
    ...
}

у меня тогда есть две конкретные реализации

public class Concrete1 extends AbSuperClass<String, String>{
    //class definition
}

и:

public class Concrete2 extends AbSuperClass2<String, String>{
    public void method(Concrete1 arg){
        //method definition
    }
}

однако это не будет компилироваться, поскольку Concrete1 не распознается как допустимый тип для аргумента метода в Concrete2, но, насколько я вижу, Concrete1 имеет правильный тип, поскольку он расширяет AbSuperClass1.

где я ошибаюсь?

2 ответов


Eclipse предложил добавить этот метод:

@Override
public <Q extends AbSuperClass1<String, String>> void method(Q arg) {
    // TODO Auto-generated method stub

}

еще одна вещь вы можете сделать, это добавить этот параметр типа класса:

abstract class AbSuperClass2<K,S, Q extends AbSuperClass1<K,S>> {
    public abstract void method(Q arg);
}

и

class Concrete2 extends AbSuperClass2<String, String, Concrete1> {
    public void method(Concrete1 arg) {
        //method definition
    }
}

считайте эту программу:

public class OtherConcrete extends AbSuperClass<String, String> {}

AbSuperClass2<String, String> x = new Concrete2();
x.method(new OtherConcrete());

чего бы вы ожидали от этого? Вы переопределили метод с точки зрения предоставления реализации для один специфический подвид of AbSuperClass<String, String> - но вы не предоставили реализацию, которая может справиться с любой AbSuperClass<String, String>, что и требуется.

трудно предложить конкретный курс действий, не зная подробностей ситуации. Предложение Божо о добавлении другого параметра типа - позволяя вам сделать method декларация более конкретная - хорошая... но все становится очень сложным. Если вы можете разработать какой-либо способ уменьшить количество общего фанкинса, ваши сопровождающие кода, вероятно, поблагодарят вас за это.