Una duda sobre la interfaz funcional de Java: ¿Por qué la interfaz Comparator tiene dos métodos abstractos comparan y son iguales, y el Comparator sigue siendo una interfaz funcional? (@FunctionalInterface)

    Primero, cada interfaz funcional puede usar una anotación : @FunctionalInterface . Entonces echemos un vistazo al javadoc de la anotación:

Un tipo de anotación informativa que se utiliza para indicar que una declaración de tipo de interfaz está destinada a ser una interfaz funcional según lo definido por la Especificación del lenguaje Java. Conceptualmente, una interfaz funcional tiene exactamente un método abstracto. Dado que los métodos predeterminados tienen una implementación, no son abstractos. Si una interfaz declara un método abstracto que anula uno de los métodos públicos de java.lang.Object, eso tampoco cuenta para el recuento de métodos abstractos de la interfaz, ya que cualquier implementación de la interfaz tendrá una implementación de java.lang.Object o de otro lugar.
 
Tenga en cuenta que se pueden crear instancias de interfaces funcionales con expresiones lambda, referencias a métodos o referencias a constructores.
 
Si un tipo está anotado con este tipo de anotación, los compiladores deben generar un mensaje de error a menos que:
• El tipo sea un tipo de interfaz y no un tipo de anotación, enumeración o clase.
• El tipo anotado satisface los requisitos de una interfaz funcional.
 
Sin embargo, el compilador tratará cualquier interfaz que cumpla con la definición de interfaz funcional como una interfaz funcional independientemente de si está presente o no una anotación de interfaz funcional en la declaración de interfaz.

    Ahora, traduzcamos manualmente : de
        acuerdo con la definición de la especificación del lenguaje Java, una declaración de tipo de interfaz que utilice esta anotación se considerará una interfaz funcional . Conceptualmente, una interfaz funcional tiene un solo método abstracto . Dado que se han implementado los métodos predeterminados, no son métodos abstractos. Si el método abstracto declarado en una interfaz anula cualquier método público en el Objeto de superclase, estos métodos abstractos no se contarán en el número de métodos abstractos de la interfaz. Porque la implementación de cualquier interfaz obtendrá la implementación de estos métodos desde su Objeto padre u otros lugares.
        Nota: La realización de la interfaz funcional se puede realizar mediante expresión lambda , referencia de método , referencia de constructor, etc.
        Si un tipo usa esta anotación, el compilador generará un mensaje de error, a menos que el tipo sea un tipo de interfaz , no un tipo de anotación, enumeración o clase. Al mismo tiempo, la interfaz que utiliza esta anotación cumple con los requisitos de una interfaz funcional, es decir, tiene una interfaz funcional y solo un método abstracto.
        Sin embargo, el compilador tratará todas las interfaces definidas como interfaces funcionales (que cumplen los requisitos de las interfaces funcionales) como interfaces funcionales, independientemente de si se utiliza la anotación de interfaces funcionales (es decir, @FunctionalInterface) en la declaración de interfaz.
    De ella podemos saber:

  1. Una interfaz funcional tiene un solo método abstracto.
  2. Los métodos predeterminados no son métodos abstractos porque ya están implementados.
  3. Un método que anula cualquier método público en la clase Object de la superclase no se considera un método abstracto en la interfaz.

    Entonces, aunque hay dos métodos abstractos de comparación e igual en la interfaz del Comparador, los iguales no se cuentan como métodos abstractos en la interfaz, por lo que la interfaz del Comparador aún cumple los requisitos de una interfaz funcional y la interfaz del Comparador es una interfaz funcional.

Expresiones Java-Lambda / referencias a métodos / referencias a constructores / referencias a matrices (ejemplos en muchos casos)

Supongo que te gusta

Origin blog.csdn.net/H_X_P_/article/details/105030682
Recomendado
Clasificación