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

Другими словами, каковы точные правила того, как компилятор Java определяет, какой перегруженный метод выбрать для выполнения?Я потратил много времени на поиск в Google и думаю, что не использую правильные ключевые слова для поиска.

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 ]

1 голос
/ 18 февраля 2010

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

0 голосов
/ 18 февраля 2010

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

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

...