Автоматическое обновление при вызове функции с нулевым

Этот код распечатывает 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,

Другие вопросы по тегам