Comment mettre en œuvre un générique de `max(Comparable à un, Comparable b) la fonction en Java?

Je suis en train d'écrire un générique max la fonction qui prend deux Comparables.

Pour l'instant j'ai

public static <T extends Comparable<?>> T max(T a, T b) {
    if (a == null) {
        if (b == null) return a;
        else return b;
    }
    if (b == null)
        return a;
    return a.compareTo(b) > 0 ? a : b;
}

Cela ne compile avec

The method compareTo(capture#5-of ?) in the type Comparable<capture#5-of ?> is not applicable for the arguments (T)

Ce que je pense c'est de dire, c'est que le ? dans Comparable<?> peut être interprété comme un type de paramètre a, et un autre pour le paramètre b, de sorte qu'ils ne peuvent pas être comparés.

Comment dois-je creuser moi-même de sortir de ce trou?

  • Dans le if(a==null) bloc, il n'est pas nécessaire pour le imbriquée si la clause. Réduire le bloc de return b; donne le même résultat (null quand b est null, b contraire).
  • Voir org.apache.commons.lang3.ObjectUtils.comparez