Surprise avec le JDK 8 update 20

Cela fait maintenant quelques temps que j’utilise le Java 8, et je ne peux plus me passer de ses nouveautés : lambdas, streams, etc.

Mais aujourd’hui, en voulant tester la dernière mise à jour d’Oracle (update 20), j’ai eu une surprise : un code qui jusque là fonctionnait sans problème ne compile plus.

Voici un code simplifié illustrant le problème :

1
2
3
4
5
6
7
8
9
public static <T> T firstNonNull(T first, T second) {
  return first != null ? first : second;
}
 
public static Set<String> getStrings() {
 return new HashSet<>();
}
 
public static Set<String> doesNotCompileWithUpdate20 = firstNonNull(getStrings(), new HashSet<>());

Ce code compile sans difficultés avec toutes les versions précédentes du JDK 8 (release initiale, update 5, update 11). Mais après la dernière mise à jour, il n’arrive plus à inférer le type du dernier « new HashSet<>()« . Pour que le code compile à nouveau, il faut expliciter le type que le JDK n’arrive plus à inférer à partir du contexte :

1
public static Set<String> compile = firstNonNull(getStrings(), new HashSet<String>());

Si vous avez une explication à ce phénomène (autre qu’un bug dans la dernière release), merci de m’éclairer. J’ai ouvert une question à ce sujet sur StackOverflow.

À propos de Benoît Courtine

Open Source enthousiast, and CTO at Alcion Group.
Ce contenu a été publié dans Java, avec comme mot(s)-clé(s) . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.