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
декларация более конкретная - хорошая... но все становится очень сложным. Если вы можете разработать какой-либо способ уменьшить количество общего фанкинса, ваши сопровождающие кода, вероятно, поблагодарят вас за это.