"метод неоднозначен для типа", но типы НЕ являются двусмысленными (и ошибка возникает при обновлении с 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 оба вызова метода действительны)