Як було сказано, роздільна здатність перевантаження виконується під час компіляції.
Java Puzzlers має прекрасний приклад для цього:
Головоломка 46: Справа заплутаного конструктора
Ця головоломка представляє два заплутані конструктори. Основний метод викликає конструктор, але який? Вихід програми залежить від відповіді. Що друкує програма, чи це навіть законно?
public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}
Рішення 46: Випадок заплутаного конструктора
... Процес вирішення перевантаження Java працює в два етапи. На першому етапі вибираються всі доступні та застосовні методи або конструктори. Друга фаза вибирає найбільш специфічний із методів або конструкторів, обраних на першій фазі. Один метод або конструктор менш специфічний, ніж інший, якщо він може приймати будь-які параметри, передані іншому [JLS 15.12.2.5].
У нашій програмі обидва конструктори доступні та застосовні. Конструктор
Confusion (Object) приймає будь-який параметр, переданий Confusion (подвійний []) , тому
Confusion (Object) менш конкретний. (Кожен подвійний масив - це Об'єкт , але не кожен Об'єкт - це подвійний масив .) Отже, найбільш специфічний конструктор є заплутаним (подвійний []) , що пояснює вихід програми.
Така поведінка має сенс, якщо ви передаєте значення типу double [] ; це протиінтуїтивно, якщо ви переходите до нуля . Ключовим моментом для розуміння цієї головоломки є те, що тест, для якого методу чи конструктора найбільш конкретний, не використовує фактичні параметри : параметри, що з’являються у виклику. Вони використовуються лише для визначення того, які перевантаження застосовуються. Після того, як компілятор визначає, які перевантаження застосовні та доступні, він вибирає найбільш конкретну перевантаження, використовуючи лише формальні параметри: параметри, що відображаються в декларації.
Щоб викликати конфузний (об'єкт) конструктор з нульовим параметром, напишіть новий конфузний ((об’єкт) нуль) . Це гарантує, що застосовується лише заплутаність (об'єкт) . Більш загально, щоб змусити компілятор вибрати конкретну перевантаження, привласнити фактичні параметри до оголошених типів формальних параметрів.