Techniquement, Java utilise l' inférence de type lors de l'utilisation de génériques. Avec une méthode générique comme
public <T> T foo(T t) {
return t;
}
Le compilateur analysera et comprendra que lorsque vous écrivez
// String
foo("bar");
// Integer
foo(new Integer(42));
Une chaîne va être renvoyée pour le premier appel et un entier pour le deuxième appel en fonction de ce qui a été entré en tant qu'argument. Vous obtiendrez la vérification appropriée lors de la compilation. De plus, en Java 7, on peut obtenir des déductions de types supplémentaires lors de l’ instanciation de génériques tels que
Map<String, String> foo = new HashMap<>();
Java a la gentillesse de nous indiquer les crochets vierges. Maintenant, pourquoi Java ne prend-il pas en charge l’ inférence de type dans le cadre d’une affectation de variable? À un moment donné, il y avait une RFE pour l'inférence de type dans les déclarations de variable, mais elle était fermée en tant que "ne résoudra pas" car
Les humains bénéficient de la redondance de la déclaration de type de deux manières. Premièrement, le type redondant sert de documentation précieuse - les lecteurs ne doivent pas rechercher la déclaration de getMap () pour savoir quel type il renvoie. Deuxièmement, la redondance permet au programmeur de déclarer le type voulu et de bénéficier ainsi d’un contrôle croisé effectué par le compilateur.
Le contributeur qui a clôturé cette session a également noté que cela ne faisait que ressembler à un "non-java-like", ce avec quoi je suis du même avis. La verbosité de Java peut être à la fois une bénédiction et une malédiction, mais elle fait du langage ce qu’il est.
Bien entendu, ce RFE n’était pas la fin de cette conversation. Au cours de Java 7, cette fonctionnalité a de nouveau été prise en compte , et certaines implémentations de test ont été créées, notamment celle de James Gosling lui-même. Encore une fois, cette fonctionnalité a finalement été abattue.
Avec la sortie de Java 8, nous obtenons maintenant l'inférence de type en tant que partie de lambdas en tant que telle:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
Le compilateur Java est capable d’examiner la méthode Collections#sort(List<T>, Comparator<? super T>)
, puis l’interface de, Comparator#compare(T o1, T o2)
et détermine ainsi first
et second
devrait String
permettre au programmeur de ne pas avoir à reformuler le type dans l’expression lambda.