"метод неоднозначен для типа", но типы НЕ являются двусмысленными (и ошибка возникает при обновлении с eclipse 3.7.2 до eclipse 4.2)
Я определил:
public static int[] getArray( final int... params ) {
return params;
}
public static <T> T[] getArray( final T... params ) {
return params;
}
И я использую это в
getArray( 1, 2 )
и теперь я получаю в eclipse 4.2 ошибку компиляции:
метод неоднозначен для типа
Но, как вы видите, это не двусмысленно. Что я могу сделать?
Ответы
Ответ 1
Об этом сообщается как ошибка в eclipse ошибка 383780.
Вот документация по исправлению:
https://bugs.eclipse.org/bugs/attachment.cgi?id=218320
В принципе, чтобы исправить ошибку компилятора, получите последнюю версию eclipse (4.2.1 на данный момент), добавьте следующую строку после -vmargs
в eclipse.ini
: (тогда вам может потребоваться перезапустить eclipse и перестроить ваши проекты)
-DtolerateIllegalAmbiguousVarargsInvocation=true
Сказав это, Самуил прав: вызов метода неоднозначен. Приведенный выше пример кода работал раньше, поскольку в JDK до 1.6 был bug; и пользовательский компилятор в eclipse успешно имитировал эту ошибку. При разработке Juno они исправили эту ошибку (поскольку ошибка JDK была исправлена в версии 1.7), сообщая о двусмысленном вызове в качестве ошибки, раздражая многих людей (включая меня). Исправление выше просит вас явно сказать затмение, чтобы "терпеть незаконный неоднозначный вызов Varargs".
Ответ 2
На самом деле это неоднозначно, потому что Autoboxing в java позволяет вам вызвать метод, ожидающий int
с Integer
и наоборот, поэтому getArray( 1, 2 )
действительно может быть действительным вызовом для любого из ваших методов.
Насколько я понимаю, что вы делаете, вы хотите иметь метод утилиты для создания массива любого типа. Возможно, самая простая вещь, которую вы можете сделать, - переименовать метод, который имеет дело с int
- getIntArray()
. Или просто используйте new int[] {1, 2}
, который очень читабельен, если вы хотите массив int
.
Вы можете найти эту информацию в спецификации языка на http://docs.oracle.com/javase/specs/jls/se5.0/jls3.pdf (в вашем случае определение вызываемого метода переходит к этапу 3 процесса, описанного в разделе 15.12.2 Время компиляции Шаг 2: Определить подпись метода, поскольку вы используете переменную arity, и на шаге 3 оба вызова метода действительны)