L'interface ComparateurDePoints peut être généralisée à tous les types d'objets, en remplaçant Point par Object. En fait, cette généralisation est faite dans le paquet java.util, qui fournit l'interface Comparator :
package java.util; public interface Comparator { public int compare(Object o1, Object o2); public boolean equals(Object obj); // définie dans Object }
La documentation indique que la méthode compare, appliquée à deux objets 70#70 et 71#71, retourne un entier 138#138, ou 237#237 ou un entier 210#210, selon que 70#70 est plus petit que 71#71, lui est égal ou lui est supérieur ; elle déclenche l'exception ClassCastException si les type des arguments ne permet pas la comparaison.
On peut maintenant définir une fonction min générale :
static Object min(Object x, Object y, Comparator ordre) { return ordre.compare(x,y) <=0 ? x : y; }
Revenons sur la comparaison des points, cette fois en réalisant l'interface Comparator :
class OrdreX implements Comparator { public int compare(Object o1, Object o2) { Point p1 = (Point) o1; Point p2 = (Point) o2; int dx = p1.x - p2.x; return dx!=0 ? dx : p1.y - p2.y ; } class OrdreY implements Comparator { public int compare(Object o1, Object o2) { Point p1 = (Point) o1; Point p2 = (Point) o2; int dy = p1.y - p2.y; return dy!=0 ? dy : p1.x - p2.x ; }
On invoquera la fonction min de la façon suivante :
Comparator ordre = new ordreX(); Point m = (Point) min(new Point(2, 3), new Point(3, 2), ordre);
Le transtypage (Point) est ici nécessaire, puisque le type de retour de min est Object, si l'on veut affecter la valeur retournée par min à une variable de type Point.