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?
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 deJava.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.
É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 deJava.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
.