J'ai rencontré un problème avec les génériques qui me laisse perplexe sur la façon dont le compilateur traite les types génériques. Prenons l'exemple suivant :
// simple interface to make it a MCVE
static interface A<F, S> {
public F getF();
public S getS();
}
static <V, S> Comparator<A<V, S>> wrap(Comparator<S> c) {
return (L, R) -> c.compare(L.getS(), R.getS());
}
Ce qui suit ne compilera pas car les deux types génériques sont réduits à Object
lors de l'appel thenComparing
:
Comparator<A<String, Integer>> c = wrap((L, R) -> Integer.compare(L, R))
.thenComparing(wrap((L, R) -> Integer.compare(L, R)));
Mais si je les décompose comme dans l'exemple suivant, tout se compile (et s'exécute) correctement :
Comparator<A<String, Integer>> c = wrap((L, R) -> Integer.compare(L, R));
c = c.thenComparing(wrap((L, R) -> Integer.compare(L, R)));
La question est donc la suivante : que se passe-t-il ici ? Je soupçonne que cela est dû à un comportement bizarre du compilateur plutôt qu'à une spécification du langage prévu ? Ou est-ce que je rate quelque chose d'évident ?