Недавно я играл с некоторым простым Java-кодом, используя методы main
, чтобы быстро протестировать код, который я написал. Я попал в ситуацию, когда у меня было два класса, похожие на те, что:
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
}
}
Я был очень удивлен, что код прекратил компиляцию, и Eclipse жаловался, что Exception IOException is not compatible with throws clause in A.main(String[])
.
Ну, оба метода статичны, а функция main
в B
просто скрывает одну из A
, поэтому я думал, что между ними нет никакой связи. В статических методах у нас нет полиморфизма, и вызов связан с реализацией конкретного метода во время компиляции, поэтому я не могу понять, почему main
in B
не может передать исключение, которое не объявлено в подписи main
в A
.
Почему разработчики Java решили принудительно использовать ограничение, подобное этому, и в каких ситуациях это может вызвать проблемы, если ограничение не было принудительно применено компилятором?