Почему в Java вызов foo() не является двусмысленным, учитывая два метода varag: foo(int… ints) и foo(Object…objects)?
-
11-09-2019 - |
Вопрос
Если я объявлю только два метода 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.