SCJP - substituir método com manipulação de exceção gera um erro do compilador
No livro SCJP de Kathey Sierra, um trecho é o seguinte:
Se um método for substituído, mas você usar uma referência polimórfica (supertipo) para se referir ao objeto subtipo com o método substituto, o compilador assume que você está chamando a versão supertipo do método. Se a versão do supertipo declara uma exceção verificada, mas o método do subtipo substituto não, o compilador ainda pensa que você está chamando um método que declara uma exceção (mais no Capítulo 5).
Vamos dar uma olhada em um exemplo:
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
}
}
Este código não será compilado devido à exceção declarada no método Animal eat (). Isso acontece mesmo que, em tempo de execução, o método eat () usado seja a versão Dog, que não declara a exceção.
Agora o que eu não entendo é que comoa.eat();
gera um erro do compilador? (a função substituída no filho pode não ter nenhuma exceção, mesmo quando Super tiver)