¿La siguiente interfaz es una interfaz funcional válida en Java 8?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
¿Por qué no me da un error de tiempo de compilación?
¿La siguiente interfaz es una interfaz funcional válida en Java 8?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
¿Por qué no me da un error de tiempo de compilación?
Respuestas:
Lo que Alok citó es cierto, pero pasó por alto algo, lo que hace que su respuesta final (que el código no es válido) sea incorrecta:
La interfaz tiene un método String toString()
que cada clase ya implementa, heredando Object
. Es decir, el método de interfaz declarado ya tiene una implementación, similar a un método predeterminado. Por lo tanto, no hay un error de compilación y Normal
puede usarse como una interfaz funcional como se muestra en mi MCVE :
package de.scrum_master.stackoverflow;
@FunctionalInterface
interface Normal {
String move();
String toString();
}
Por cierto, no es necesario declarar los métodos de interfaz public
porque siempre lo son. Lo mismo vale para abstract
.
package de.scrum_master.stackoverflow;
public class NormalApp {
static void doSomething(Normal normal) {
System.out.println(normal.move());
System.out.println(normal.toString());
}
public static void main(String[] args) {
doSomething(() -> "xxx");
}
}
Si ejecuta la aplicación del controlador, verá este registro de consola:
xxx
de.scrum_master.stackoverflow.NormalApp$$Lambda$1/1530388690@28c97a5
Ahora, si cambia el nombre del método toString
a otro, por ejemplo toStringX
, verá que debido al @FunctionalInterface
mensaje de error esperado al compilar la clase:
Unexpected @FunctionalInterface annotation
de.scrum_master.stackoverflow.Normal is not a functional interface
multiple non-overriding abstract methods found in interface de.scrum_master.stackoverflow.Normal
En primer lugar, Nitin, debe tener una investigación adecuada sobre esto, y luego debe venir a esta plataforma para preguntar sobre su problema.
Sin embargo, antes que nada, permítame aclarar su duda sobre la interfaz funcional en Java 8
- La interfaz funcional en Java 8 solo puede tener un método abstracto y cualquier número de métodos predeterminados.
- Desde Java 8 en adelante, las expresiones lambda se pueden usar para representar la instancia de una interfaz funcional.
- La anotación @FunctionalInterface se utiliza para garantizar que la interfaz funcional no pueda tener más de un método abstracto. En caso de que haya más de un método abstracto, el compilador marca un
Unexpected @FunctionalInterface annotation
mensaje. Sin embargo, no es obligatorio usar esta anotación.
Según su código solamente, pude ver dos métodos abstractos, por lo tanto , su código no es válido .
Espero que te ayude de alguna manera. Para obtener más información, consulte este enlace: Interfaz funcional Java 8