Следующий код считается недействительным компилятором:
class Foo {
void foo(String foo) { ... }
}
class Bar extends Foo {
@Override
void foo(Object foo) { ... }
}
Я думаю, что это описано в JLS 8.4.8.1: "Подпись m1 является подзаголовкой (§8.4.2) подписи m2." и в 8.4.2: "границы соответствующих переменных типа одинаковы".
Мой вопрос: почему параметр в подтипе (Bar) не может быть супертипом параметра в супертипе (Foo). В примере Object является супертипом String. Насколько я вижу, это позволяет не нарушать Принцип замены Лискова.
Есть ли сценарий, позволяющий этому сломать код или это ограничение текущего JLS?