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>
?
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.
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.
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());
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.