2010-03-07 3 views
3

Посмотрите на этот код:SCJP вопрос: Метод неоднозначным

public class Test { 
public static void main(String... args) { 
    flipFlop("hello", new Integer(4), 2004); 
    // flipFlop("hello", 10, 2004); // this works! 
} 

private static void flipFlop(String str, int i, Integer iRef) { 
    System.out.println(str + " (String, int, Integer)"); 
} 

private static void flipFlop(String str, int i, int j) { 
    System.out.println(str + " (String, int, int)"); 
} 

} 

Компилятор выдает ошибку, что вызов является неоднозначным:

Описание Путь ресурсов Местоположение Тип Метод FlipFlop (String , int, Integer) неоднозначно для типа Test Test.java scjp19 - inheritence/src line 3 Задача Java

Но если комментарий d-out используется ti invoke flip-flop, метод однозначно вызывается (второй, поскольку autoboxing приходит после использования самого примитива).

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

+2

Dupe: http://stackoverflow.com/questions/501412/why-does-autoboxing-make-some-calls-ambiguous-in-java – BalusC

ответ

6

Прокомментированные совпадения строк flipFlop(String str, int i, int j) точно. Другая строка соответствует как автобоксингу.

1

flipFlop ("hello", new Integer (4), 2004); несовместим с flipFlop (String str, int i, Integer iRef)

+1

Я не думаю, что это ... Поддержка Java 5 и более поздних версий автоматический бокс/распаковка между примитивами и их классами Wrapper. В этом случае между int и Integer. Прокомментируйте второй метод и убедитесь сами. –

0

Java 5 и более поздние версии делают автоматическое боксирование (преобразование Integer в int), следовательно, результат.

-1

Да, в соответствии с запросами, вызов должен зависеть от разницы между int/Integer @ 3rd argument. , но здесь даже разница @ 3-й аргумент имеет значение, если 2-й аргумент autoUnboxed.

даже это работа: flipFlop ("hex", новый Integer (4), новый Integer (17));

в то время как в соответствии с функцией syntex и автоматической коробкой это должно вызывать :: «частный статический void flipFlop (String str, int i, Integer iRef)», но все, что он говорит, это AMBIGUOUS ..... ??

+1

Использование полных слов (acc -> согласно, ques -> question, @ -> at) сделает ваш ответ более читабельным и полезным для других членов SO. –

Смежные вопросы