我可以使用of
方法创建Guava ImmutableList
,并根据传递的对象获取正确的泛型类型:
Foo foo = new Foo();
ImmutableList.of(foo);
但是,the of
method with no parameters无法推断泛型类型并创建ImmutableList<Object>
。
如何创建空ImmutableList
以满足List<Foo>
?
答案 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
以匹配该参数类型。