автоматическое обновление при вызове функции с нулевым - PullRequest
3 голосов
/ 08 июля 2011

Этот код печатает 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 Ответ

3 голосов
/ 08 июля 2011

См. ответ для аналогичного вопроса .

См. JLS 15.12.2 :

[...] Может быть более одного такого объявления метода, и в этом случае выбирается наиболее конкретное.

Итак, чтобы ответить на ваш вопрос.Когда несколько перегруженных методов применимы к определенному типу, вызывается наиболее специфический или, если хотите, метод «upcast».


С интуитивной точки зрения это также имеет смысл.Когда вы заявляете:

public void handler(MyException ex) {...}

Вы говорите: «Я знаю, как обращаться с генералом MyException».

А когда вы заявляете:

public void handler(MyUrgentException ex){...}

Вы говорите: «Я знаю, как обращаться с конкретным случаем MyUrgentException», и, следовательно, также с общим случаем MyException.

...