Почему в Java вызов foo() не является двусмысленным, учитывая два метода varag: foo(int… ints) и foo(Object…objects)?

StackOverflow https://stackoverflow.com/questions/951388

Вопрос

Если я объявлю только два метода varargs следующим образом:

public void foo(String... strings) {
    System.out.println("Foo with Strings");
}

и

public void foo(int... ints) {
    System.out.println("Foo with ints");
}

и затем получите код:

foo();

это ошибка компилятора из-за ожидаемой двусмысленности.

Однако если у меня есть только следующие две версии foo:

public void foo(Object... objects) {
    System.out.println("Foo with Objects");
}

и

public void foo(int... ints) {
    System.out.println("Foo with ints");
}

тогда код

foo();

вызывает ints-версию метода.Может ли кто-нибудь объяснить, почему второй пример не является столь же двусмысленным и почему он разрешается в методе int, а не в методе Object.Спасибо.

Это было полезно?

Решение

Если я правильно помню, когда я готовил scjp, в первом случае у вас есть два аргумента, между которыми нет никакой связи, поэтому компилятор не может выбрать один.

Во втором, при включенном боксе (1.5+), int может быть Integer, который является подмножеством Object, и компилятор в случае конфликта всегда будет использовать наиболее конкретное определение.Таким образом, приоритет имеет целое число (int).

Другие советы

Java всегда будет использовать ближайший возможный тип, поэтому, когда вы передаете в метод целые числа, если у вас их нет...метод, он автоматически упаковывает их в целые числа и использует Object....Так как есть int...метод, Java будет использовать его в первую очередь.Это выбор конструкции компилятора Java.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top