Почему компилятор Java 7 и Eclipse 3.8 не может компилировать код JDK с помощью нового оператора Java 7 diamond? - PullRequest
10 голосов
/ 16 августа 2011
import java.util.*;

public class SimpleArrays
{
  @SafeVarargs
  public static <T> List<T> asList( T... a )
  {
    return new ArrayList<>( a );
  }
}

asList() взято из реализации Java для Oracles java.util.Arrays.

Ошибка

error: cannot infer type arguments for ArrayList<>
    return new ArrayList<>( a );
1 error

Как это может работать? Oracle использует тот же компилятор, что и мы.

Ответы [ 2 ]

9 голосов
/ 16 августа 2011

Внимание: ArrayList, используемый в классе java.util.Arrays, - это не java.util.ArrayList, а вложенный класс java.util.Arrays.ArrayList.

В частности, у этого класса есть конструктор, который принимает T[] в качестве аргумента, которого java.util.ArrayList не имеет.

Скопируйте этот класс тоже, и он будет работать.

3 голосов
/ 16 августа 2011

Из того, что я могу собрать, Eclipse хочет найти конкретный тип для вывода в шаблон ArrayList.Например, если бы подпись вашего метода была:

public static List<Integer> asList( Integer... a )

Eclipse не будет иметь проблем с выводом типа ArrayList<>( a ) и выведет, что его тип равен Integer.Я полагаю, что бриллиантовый оператор должен работать таким образом: выводить специфический тип, а не шаблонизированный.

К счастью, вы шаблонизировали весь метод, чтобы вы могли сформировать свойСкажем так:

      return new ArrayList<T>( a );

И все будет работать :).

...