Как создать пустой 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 будет выбран для соответствия этому типу аргументов.