如何创建一个空的Guava ImmutableList?

时间:2015-04-21 15:25:22

标签: java generics guava immutablelist

我可以使用of方法创建Guava ImmutableList,并根据传递的对象获取正确的泛型类型:

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

但是,the of method with no parameters无法推断泛型类型并创建ImmutableList<Object>

如何创建空ImmutableList以满足List<Foo>

3 个答案:

答案 0 :(得分:36)

如果您将创建的列表分配给变量,则无需执行任何操作:

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

在无法推断类型的其他情况下,您必须编写ImmutableList.<Foo>of(),如@zigg所说。

答案 1 :(得分:16)

ImmutableList.<Foo>of()将创建一个带有通用类型ImmutableList的空Foo。虽然the compiler can infer the generic type在某些情况下,比如赋值给变量,但是当你为函数参数提供值时,你需要使用这种格式(正如我所做的那样)。

答案 2 :(得分:2)

自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以匹配该参数类型。