Автоматическое обновление при вызове функции с нулевым
Этот код распечатывает MyUrgentException
, Кто-нибудь может объяснить, почему?
class MyException extends Exception{
}
class MyCriticalException extends MyException{
}
class MyUrgentException extends MyCriticalException{
}
public class Test{
public void handler(MyException ex){
System.out.println("MyException");
}
public void handler(MyCriticalException ex){
System.out.println("MyCriticalException");
}
public void handler(MyUrgentException ex){
System.out.println("MyUrgentException");
}
public static void main(String [] args){
new Test().handler(null);
}
}
1 ответ
Решение
Смотрите ответ на аналогичный вопрос.
См. JLS 15.12.2:
[...] Может быть более одного такого объявления метода, и в этом случае выбирается наиболее конкретный.
Итак, чтобы ответить на ваш вопрос. Когда несколько перегруженных методов применимы для определенного типа, вызывается самый специфический или "upcast", если хотите.
С интуитивной точки зрения это также имеет смысл. Когда вы заявляете:
public void handler(MyException ex) {...}
Вы говорите: "Я знаю, как обращаться с генералом MyException
".
И когда вы заявляете:
public void handler(MyUrgentException ex){...}
Вы говорите: "Я знаю, как справиться с конкретным случаем MyUrgentException
", и, следовательно, также общий случай MyException
,