interfaz interfaces instrucciones functionalinterface funciones funcionales funcional expresiones example ejemplo anonimas java lambda java-8

java - interfaces - FunctionalInterface Comparator tiene 2 métodos abstractos



interfaces funcionales java (3)

Todas las clases descienden de la clase Objeto y el Objeto contiene un método igual. Por lo tanto, esto significa que cada instancia que implementa Comparator ya tendrá una implementación del mismo método ya que esta instancia también desciende de Objeto como cada clase. Por lo tanto, la Interfaz de comparación tiene solo un método que siempre debe ser implementado por las clases que lo implementan y por esa razón es una Interfaz funcional.

¿Aprendes Java 8 Lambdas y te preguntas cómo el compilador sabe qué método en Comparator usar para la expresión lambda? ¿No parece ser una interfaz SAM? Tiene 2 métodos abstractos:

@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }


equals() no es un método abstracto. Este método reemplaza a Object.equals(Object) , y solo existe para que la interfaz del Comparador pueda tener javadoc adjuntado al método, explicando cómo los comparadores deben implementar equals() .

Ver el javadoc de FunctionalInterface :

Si una interfaz declara un método abstracto que invalida uno de los métodos públicos de java.lang.Object, eso tampoco cuenta para el recuento del método abstracto de la interfaz, ya que cualquier implementación de la interfaz tendrá una implementación desde java.lang.Object o en cualquier otro lugar.


equals () se hereda de Object, y los métodos públicos heredados no se cuentan cuando se determina si una interfaz es una interfaz funcional. Entonces, aunque equals () es abstracto en Comparator, porque se hereda, no cuenta.

REGLA: Una interfaz funcional es una interfaz que tiene un método abstracto. Los métodos predeterminados no cuentan; los métodos estáticos no cuentan; y los métodos heredados de Objeto no cuentan.