Дженерики 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.

Где я иду не так, как надо?

9
задан Tom 22 June 2010 в 17:30
поделиться

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
    }
}
3
ответ дан 4 December 2019 в 22:27
поделиться

Рассмотрим эту программу:

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

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

Что бы вы ожидали от нее? Вы переопределили метод в плане предоставления реализации для одного конкретного подтипа AbSuperClass - но вы не предоставили реализацию, которая может справиться с любым AbSuperClass , что и требуется.

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

5
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: