25

我可以使用该方法创建一个GuavaImmutableListof,并将根据传递的对象获得正确的泛型类型:

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

但是,没有参数of方法无法推断泛型类型并创建一个ImmutableList<Object>.

我怎样才能创造一个空ImmutableList来满足List<Foo>

4

3 回答 3

42

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

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

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

于 2015-04-21T15:27:30.130 回答
18

ImmutableList.<Foo>of()ImmutableList将创建一个具有泛型类型的空Foo。尽管编译器在某些情况下可以推断出泛型类型,例如对变量的赋值,但是当您为函数参数提供值时,您需要使用这种格式(就像我所做的那样)。

于 2015-04-21T15:25:21.717 回答
2

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

于 2017-12-25T13:49:00.557 回答