27 votes

Influence de l'opérateur ternaire de Java sur l'inférence de type des génériques

public List<String> foo1() {
    List<String> retval = bar();
    if (retval == null)
        return Collections.emptyList();
    else
        return retval;
}

public List<String> foo2() {
    List<String> retval = bar();
    return retval == null ? Collections.emptyList() : retval;
}

Pourquoi est-ce que foo1() compile bien alors que foo2() a une erreur ? (pour être plus précis "Erreur de type : impossible de convertir une liste<capture#1-de ? extends Object> en liste<String>" )

J'aurais pensé que les deux fonctions se compileraient dans le même bytecode, donc un compilateur intelligent devrait déduire le type correct pour la fonction emptyList() ...

24voto

dkatzel Points 9062

Compile bien pour moi en java 8.

Les versions antérieures de Java peuvent nécessiter plus d'aide

return retval == null ? Collections.<String>emptyList() : retval;

devrait fonctionner.

EDIT Cela est dû aux améliorations apportées à l'inférence de type de Java 8, comme expliqué ici.

http://openjdk.java.net/jeps/101

Et voici un blog avec les points forts : http://blog.jooq.org/2013/11/25/a-lesser-known-java-8-feature-generalized-target-type-inference/

4voto

Ceci est lié au Type Inférence à partir d'une méthode générique .

En cas de code antérieur à la ver. 8. Il faut déclarer le type de résultat pour ce cas.

return retval == null ? Collections.<String>emptyList() : retval;

Depuis ver. 8, la notion de ce qu'est un type cible a été étendue pour inclure les arguments de méthode. Ce n'est donc plus nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X