web-dev-qa-db-fra.com

Comment créer une liste immuable Guava vide?

Je peux créer un Guava ImmutableList avec la méthode of, et obtiendra le type générique correct en fonction des objets passés:

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

Cependant, la méthode of sans paramètres ne peut pas déduire le type générique et crée un ImmutableList<Object>.

Comment puis-je créer un ImmutableList vide pour satisfaire List<Foo>?

23
zigg

Si vous affectez la liste créée à une variable, vous n'avez rien à faire:

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

Dans d'autres cas où le type ne peut pas être déduit, vous devez écrire ImmutableList.<Foo>of() comme le dit @zigg.

37
ColinD

ImmutableList.<Foo>of() créera un ImmutableList vide de type générique Foo. Bien que le compilateur puisse déduire le type générique dans certaines circonstances, comme l'affectation à une variable, vous devrez utiliser ce format (comme je l'ai fait) lorsque vous fournissez la valeur d'un argument de fonction.

17
zigg

Depuis Java 8 le compilateur est beaucoup plus intelligent et peut comprendre les paramètres des paramètres de type dans plus de situations.

Exemple:

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

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

Explication

La nouveauté de Java 8 est que le type cible d'une expression sera utilisé pour déduire les paramètres de type de ses sous-expressions. Avant Java 8 uniquement les arguments des méthodes utilisées pour l'inférence des paramètres de type (la plupart du temps, une exception concerne les affectations).

Dans ce cas, le type de paramètre de test sera le type cible pour of(), et le type de valeur de retour de of sera choisi pour correspondre à ce type d'argument.

2
Lii