Почему компилятор Java 7 и Eclipse 3.8 не компилирует JDK-код с новым оператором алмаза Java 7?

import java.util.*;

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

asList() берется из реализации JAK Oracles java.util.Arrays.

Ошибка

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

      return new ArrayList<T>( a );

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