SCJP - метод переопределения с обработкой исключений вызывает ошибку компилятора
В книге SCJP Кэти Сьерра, выдержка выглядит следующим образом:
Если метод переопределен, но вы используете полиморфную ссылку (супертип) для ссылки на объект подтипа с помощью метода переопределения, компилятор предполагает, что вы вызываете версию метода супертипа. Если версия супертипа объявляет проверенное исключение, а переопределенный метод подтипа - нет, компилятор все еще думает, что вы вызываете метод, который объявляет исключение (подробнее в Главе 5).
Давайте посмотрим на пример:
class Animal {
public void eat() throws Exception {
// throws an Exception
}
}
class Dog2 extends Animal {
public void eat() { /* no Exceptions */ }
public static void main(String[] args) {
Animal a = new Dog2();
Dog2 d = new Dog2();
d.eat(); // ok
a.eat(); // compiler error -
// unreported exception
}
}
Этот код не будет компилироваться из-за исключения, объявленного в методе Animal eat (). Это происходит, хотя во время выполнения используемый метод eat () будет версией Dog, которая не объявляет исключение.
Что я не понимаю, так это какa.eat();
вызывает ошибку компилятора? (переопределенная функция у ребенка может не иметь никакого исключения, даже если у Super есть)