Как мне создать пустой Guava ImmutableList?

Я могу создать гуавуImmutableList с of метод, и получит правильный универсальный тип на основе переданных объектов:

Foo foo = new Foo();
ImmutableList.of(foo);

Тем не менее, of метод без параметров не может вывести общий тип и создает ImmutableList<Object>,

Как я могу создать пустой ImmutableList удовлетворить List<Foo>?

3 ответа

Решение

Если вы назначаете созданный список переменной, вам не нужно ничего делать:

ImmutableList<Foo> list = ImmutableList.of();

В других случаях, когда тип не может быть выведен, вы должны написать ImmutableList.<Foo>of() как говорит @zigg.

ImmutableList.<Foo>of() создаст пустой ImmutableList с универсальным типом Foo, Хотя компилятор может выводить универсальный тип в некоторых обстоятельствах, например, при присваивании переменной, вам нужно использовать этот формат (как я это сделал), когда вы предоставляете значение для аргумента функции.

Начиная с Java 8, компилятор стал намного умнее и может определять параметры параметров типа в большинстве ситуаций.

Пример:

void test(List<String> l) { ... }

// Type checks in Java 8 but not in Java 7
test(ImmutableList.of()); 

объяснение

Новым в Java 8 является то, что целевой тип выражения будет использоваться для определения параметров типа его подвыражений. До Java 8 только аргументы методов, которые используются для вывода параметров типа. (В большинстве случаев одним исключением являются назначения.)

В этом случае тип параметра test будет целевым типом для of()и тип возвращаемого значения of будет выбран в соответствии с этим типом аргумента.

Другие вопросы по тегам