Страницы

Поиск по вопросам

четверг, 8 ноября 2018 г.

Почему вызов m(null) не считается неоднозначным?

public class H1 { public static void main(String[] args) { m(null); } public static void m(Object o) {System.out.println("Object");} public static void m(String s) {System.out.println("String");} //public static void m(Integer i) {System.out.println("Integer");} }
Данный код компилируется и выводит в консоль "String". Вопрос: почему вызов m(null) не считается неоднозначным, ведь если раскоментировать строку с параметром типа Integer неоднозначность появится.


Ответ

Потому что используется правило выбора наиболее подходящего метода (из спецификации - 15.12.2.5. Choosing the Most Specific Method).
В вашем примере для null-аргумента подходят два метода, но класс Object является родительским классом для String, поэтому компилятор останавливается на void m(String s)
Если раскомментировать метод void m(Integer i), то для компилятора оба метода (кроме void m(Object o)) будут наиболее подходящими - отсюда и сообщение об неоднозначности вызова метода.

Комментариев нет:

Отправить комментарий