Diferença de assinatura ao ocultar o método estático em uma subclasse
Recentemente eu estava brincando com um código Java simples usandomain
métodos para testar rapidamente o código que escrevi. Acabei em uma situação em que eu tinha duas classes semelhantes a essas:
public class A {
public static void main(String[] args) {
// code here
}
}
public class B extends A {
public static void main(String[] args) throws IOException {
// code here
}
}
Fiquei surpreso ao saber que o código parou de ser compilado e o Eclipse reclamou queException IOException is not compatible with throws clause in A.main(String[])
.
Bem, ambos os métodos são estáticos e osmain
função emB
está apenas escondendo aqueleA
, então pensei que não havia nenhuma relação entre eles. Nos métodos estáticos, não temos polimorfismo e a chamada é vinculada à implementação do método concreto durante a compilação, portanto, não consigo entender por quemain
noB
não pode lançar exceção que não é declarada emmain
assinatura emA
.
Por que os designers de Java decidiram impor uma restrição como essa e em que situações isso causaria problemas se a restrição não fosse imposta pelo compilador?