Как создать пустой Guava ImmutableList?
Я могу создать Guava ImmutableList
с помощью метода of
и получить правильный общий тип на основе переданных объектов
Foo foo = new Foo();
ImmutableList.of(foo);
Однако метод of
без параметров не может вывести общий тип и создает ImmutableList<Object>
.
Как создать пустой ImmutableList
для удовлетворения List<Foo>
?
Ответы
Ответ 1
Если вы назначаете созданный список переменной, вам ничего не нужно делать:
ImmutableList<Foo> list = ImmutableList.of();
В других случаях, когда тип не может быть выведен, вы должны написать ImmutableList.<Foo>of()
, как говорит @zigg.
Ответ 2
ImmutableList.<Foo>of()
создаст пустой ImmutableList
с общим типом Foo
. Хотя компилятор может вывести общий тип в некоторых случаях, например присвоение переменной, вам нужно будет использовать этот формат (как и я), когда вы предоставляете значение для аргумента функции.
Ответ 3
Начиная с Java 8, компилятор гораздо умнее и может определить параметры параметров типа в большем количестве ситуаций.
Пример:
void test(List<String> l) { ... }
// Type checks in Java 8 but not in Java 7
test(ImmutableList.of());
Объяснение
Новое в Java 8 состоит в том, что target type выражения будет использоваться для вывода параметров типа его подвыражений. До Java 8 только аргументы для методов, которые используются для вывода параметра типа. (В большинстве случаев одним исключением являются назначения.)
В этом случае тип параметра test
будет целевым типом для of()
, а тип возвращаемого значения of
будет выбран для соответствия этому типу аргументов.