Java завжди намагатиметься використовувати найбільш конкретну застосовну версію доступного методу (див. JLS §15.12.2 ).
Object
, char[]
і Integer
всі вони можуть приймати null
як дійсне значення. Тому всі 3 версії застосовні, тому Java доведеться знайти найбільш конкретну.
Оскільки Object
це супер-тип char[]
, версія масиву є більш специфічною, ніж Object
-версія. Тож якщо існують лише ці два методи, char[]
буде обрана версія.
Коли обидва char[]
Integer
версії та версії, то обидві вони Object
більш конкретні, ніж одна, але жодна не є більш конкретною, ніж інша, тому Java не може вирішити, яку з них викликати. У цьому випадку вам доведеться чітко вказати, до якого ви хочете зателефонувати, передавши аргумент у відповідний тип.
Зауважте, що на практиці ця проблема виникає набагато рідше, ніж можна було б подумати. Причиною цього є те, що це відбувається лише тоді, коли ви явно викликаєте метод із null
змінною досить неспецифічного типу (наприклад, Object
).
Навпаки, таке виклик було б абсолютно однозначним:
char[] x = null;
doSomething(x);
Хоча ви все ще передаєте значення null
, Java точно знає, який метод викликати, оскільки він враховує тип змінної.
Integer
наint
.