У меня есть следующие абстрактные классы:
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.
Где я иду не так, как надо?
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());
Что бы вы ожидали от нее? Вы переопределили метод в плане предоставления реализации для одного конкретного подтипа AbSuperClass
- но вы не предоставили реализацию, которая может справиться с любым AbSuperClass
, что и требуется.
Трудно предложить конкретный курс действий, не зная деталей ситуации. Предложение Божо о добавлении еще одного параметра типа - позволяющего сделать объявление метода
более конкретным - хорошее... но все это становится очень сложным. Если вы сможете придумать какой-нибудь способ уменьшить количество общих заморочек, ваши сопровождающие, вероятно, будут вам за это благодарны.