Где задокументированы предпочтительные преобразования аргументов для перегруженных методов (если вообще задокументированы)?


Другими словами, каковы точные правила для того, как компилятор 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 2

2 ответа:

Соответствующей частью JLS является 15.12.2 этап компиляции 2: Определение сигнатуры метода . Правила являются сложными и техническими, но общий принцип заключается в том, что выбирается применимый метод с наиболее специфическими типами аргументов.

Я думаю, что это указано в спецификации языка Java , преобразования.

Я вижу оттуда, что это должно быть расширяющееся ссылочное преобразование, но я не вижу никаких замечаний о пути. Мне кажется, что он ищет кратчайший путь соответствия (в дереве наследования), поскольку это наиболее логично, но опять же, я не могу найти его в спецификации.