Вывод на консоль в данном случае получается 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
, например -- компилятор вас не поймет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
А ещё есть специальное ключевое слово final, и если оно присутствует в объявлении переменной, вам будет разрешено присвоить значение этой переменной...
Есть мобильное приложение на android с одной стороны и веб-сервис от 1с с другой стороныУже реализована передача данных из 1с в приложение
Без Pattern данные выводятся такие: USD 27827 28