В Java, почему вызов foo () не является неоднозначным, учитывая 2 метода varags foo (int ... ints) и foo (Object ... objects)? - PullRequest
10 голосов
/ 04 июня 2009

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

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

и

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

и затем иметь код:

foo();

это ошибка компилятора из-за неопределенности, как и ожидалось.

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

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

и

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

тогда код

foo();

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

Ответы [ 2 ]

29 голосов
/ 04 июня 2009

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

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

4 голосов
/ 04 июня 2009

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

...