Вывод на консоль в данном случае получается FileNotFoundException. Как именно осуществляется выбор нужного метода для вызова?
public class Overload {
public void method(Object o) {
System.out.println("Object");
}
public void method(java.io.FileNotFoundException f) {
System.out.println("FileNotFoundException");
}
public void method(java.io.IOException i) {
System.out.println("IOException");
}
public static void main(String[] args) {
Overload test = new Overload();
test.method(null);
}
}
If more than one member method is both accessible and applicable to a method invocation, it is necessary to choose one to provide the descriptor for the run-time method dispatch. The Java programming language uses the rule that the most specific method is chosen.
JLS 15.12.2.5
Компилятор выбирает метод, у которого тип параметра, вызывающего неоднозначность, наиболее конкретный (дальше от корня иерархии). В вашем примере FileNotFoundException -- потомок IOException, а IOException потомок Object (непрямой, через Exception и Throwable), т. е. крайний в дереве наследования -- FileNotFoundException -- он и будет выбран. Если классы находятся в разных ветвях иерархии наследования, будет ошибка компиляции. Попробуйте в своем примере заменить IOException на EOFException (тоже прямой потомок IOException), или FileNotFoundException на String, например -- компилятор вас не поймет.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости