Я хочу переопределить метод и заменить параметр, который он принимает, подклассом этого параметра.
Для возвращаемого типа проблем нет, потому что они не являются частью сигнатуры метода и могут быть заменены подклассами (так называемые "ковариантные возвращаемые типы"). Для аргументов это не работает, потому что они являются частью подписи.
Итак, я нашел решение использовать общий параметр того же типа:
public abstract class A<T extends A> {
public void loadValuesFrom(T source) {
...
}
}
public class B extends A<B> {
public void loadValuesFrom(B source) {
super.loadValuesFrom(source);
...
}
}
Но утверждение «общедоступный абстрактный класс A» кажется мне странным. Есть ли другие способы добиться этого? Любой «ковариантный тип параметра»? :-)