Почему компилятор 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 );
И все будет работать:).