Множественные перегруженные методы: имеет ли значение NullPointerException равное нулю?
public class TestMain {
public static void methodTest(Exception e) {
System.out.println("Exception method called");
}
public static void methodTest(Object e) {
System.out.println("Object method called");
}
public static void methodTest(NullPointerException e) {
System.out.println("NullPointerException method called");
}
public static void main(String args[]) {
methodTest(null);
}
}
Выход: метод NullPointerException, называемый
Ответы
Ответ 1
Если есть несколько перегруженных методов, которые могут быть вызваны с заданным параметром (null
в вашем случае), компилятор выбирает наиболее специфический.
См. http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5
В вашем случае methodTest(Exception e)
более конкретно, чем methodTest(Object e)
, так как Exception является подклассом Object. И methodTest(NullPointerException e)
еще более определен.
Если вы замените NullPointerException другим подклассом Exception, компилятор выберет тот.
С другой стороны, если вы сделаете дополнительный метод, например testMethod(IllegalArgumentException e)
, компилятор выкинет ошибку, так как не знает, какой из них выбрать.
Ответ 2
Компилятор будет пытаться соответствовать самому определенному параметру, который в этом случае NullPointerException
. Вы можете увидеть дополнительную информацию в Спецификации языка Java, раздел 15.12.2.5. Выбор наиболее конкретного метода:
Если более чем один метод-член доступен и применим к необходимо вызвать один из них, чтобы обеспечить дескриптор для отправки времени выполнения. Программирование на Java язык использует правило, в котором выбран наиболее специфический метод.
Неформальная интуиция заключается в том, что один метод более конкретный, чем другой, если любой вызов, обработанный первым методом, может быть передан на другой, без ошибки типа компиляции.
[...]