Где задокументированы предпочтительные преобразования аргументов для перегруженных методов (если вообще задокументированы)?
Другими словами, каковы точные правила для того, как компилятор Java определяет, какой перегруженный метод выбрать для выполнения? Я потратил много времени на гугл, и мне кажется, что я не использую правильные ключевые слова для поиска.
public class C1 extends C2 {}
public class C2 extends C3 {}
public class C3 {}
public class Test {
public static void main(String[] args) {
C1 c1 = new C1();
// What are the precise rules for determining
// which method below is called?
method(c1, c1);
}
static public void method(C3 test, C3 test2) {
System.out.println("C3");
}
static public void method(C2 test, C3 test2) {
System.out.println("C2");
}
}
2 ответа:
Соответствующей частью JLS является 15.12.2 этап компиляции 2: Определение сигнатуры метода . Правила являются сложными и техническими, но общий принцип заключается в том, что выбирается применимый метод с наиболее специфическими типами аргументов.
Я думаю, что это указано в спецификации языка Java , преобразования.
Я вижу оттуда, что это должно быть расширяющееся ссылочное преобразование, но я не вижу никаких замечаний о пути. Мне кажется, что он ищет кратчайший путь соответствия (в дереве наследования), поскольку это наиболее логично, но опять же, я не могу найти его в спецификации.