web-dev-qa-db-fra.com

Comment le comparateur peut-il être une interface fonctionnelle lorsqu'il a deux méthodes abstraites?

Dans Java 8, le @FunctionalInterface l'annotation est introduite pour désigner toute interface qui a exactement une méthode abstraite comme interface fonctionnelle. L'une des raisons de son introduction est d'indiquer à l'utilisateur (programmeur), que l'expression lambda peut être utilisée dans le contexte d'une interface fonctionnelle.

L'interface Comparator est annotée avec @FunctionalInterface. Mais, deux méthodes sont abstraites.

int compare(T o1, T o2);

et

boolean equals(Object obj);

Dans les documents de FunctionalInterface , il est clairement mentionné comme

Conceptuellement, une interface fonctionnelle a exactement une méthode abstraite.

La méthode equals n'est-elle pas considérée comme abstraite ici?

22
Arun

Les documents indiquent également:

Si une interface déclare une méthode abstraite remplaçant l'une des méthodes publiques de Java.lang.Object, qui ne compte pas non plus dans le nombre de méthodes abstraites de l'interface car toute implémentation de l'interface aura une implémentation de Java.lang.Object ou ailleurs.

Et puisque equals est l'une de ces méthodes, le "nombre de méthodes abstraites" de l'interface est toujours 1.

36
luk2302

Également depuis la page de documentation FunctionalInterface :

Si une interface déclare une méthode abstraite remplaçant l'une des méthodes publiques de Java.lang.Object, cela aussi pas compte pour le compte de méthode abstraite de l'interface car toute implémentation de l'interface aura une implémentation de Java.lang.Object ou ailleurs. [c'est moi qui souligne]

Puisque equals est une méthode publique de Object, cette instruction s'applique; ainsi, pour Comparator seule la méthode compare contribue au décompte des méthodes abstraites.

D'autres méthodes notables auxquelles cette règle s'applique sont toString et hashCode .

15
gyre