Question: I can create a [Guava `ImmutableList`](https://google.github.io/guava/releases/23.0/api/docs/com/google/common/collect/ImmutableList.html) with the `of` method, and will get the correct generic type based on the passed objects:

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

```

However, [the `of` method with no parameters](https://google.github.io/guava/releases/23.0/api/docs/com/google/common/collect/ImmutableList.html#of--) cannot infer the generic type and creates an `ImmutableList<Object>`.

How can I create an empty `ImmutableList` to satisfy `List<Foo>`?

Answer: 
If you assign the created list to a variable, you don't have to do anything:

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

```

In other cases where the type can't be inferred, you have to write `ImmutableList.<Foo>of()` as @zigg says.
Since Java 8 the compiler is much more clever and can figure out the type parameters parameters in more situations.

Example:

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

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

```

### Explanation

The new thing in Java 8 is that the [target type](https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html#target_types) of an expression will be used to infer type parameters of its sub-expressions. Before Java 8 only arguments to methods where used for type parameter inference. (Most of the time, one exception is assignments.)

In this case the parameter type of `test` will be the target type for `of()`, and the return value type of `of` will get chosen to match that argument type.