Ist die folgende Schnittstelle eine gültige Funktionsschnittstelle in Java 8?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
Warum gibt es keinen Fehler bei der Kompilierung?
Ist die folgende Schnittstelle eine gültige Funktionsschnittstelle in Java 8?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
Warum gibt es keinen Fehler bei der Kompilierung?
Antworten:
Was Alok zitiert hat, ist wahr, aber er hat etwas übersehen, was seine endgültige Antwort (dass der Code ungültig ist) falsch macht:
Die Schnittstelle verfügt über eine Methode, String toString()
die jede Klasse bereits implementiert und von der sie erbt Object
. Das heißt, die deklarierte Schnittstellenmethode hat bereits eine Implementierung, ähnlich einer Standardmethode. Daher gibt es keinen Kompilierungsfehler und Normal
kann als funktionale Schnittstelle verwendet werden, wie in meinem MCVE gezeigt :
package de.scrum_master.stackoverflow;
@FunctionalInterface
interface Normal {
String move();
String toString();
}
Übrigens müssen Schnittstellenmethoden nicht deklariert werden, public
da dies immer der Fall ist. Gleiches gilt für 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");
}
}
Wenn Sie die Treiberanwendung ausführen, wird dieses Konsolenprotokoll angezeigt:
xxx
de.scrum_master.stackoverflow.NormalApp$$Lambda$1/1530388690@28c97a5
Wenn Sie nun den Methodennamen toString
in etwas anderes ändern , z. B. toStringX
werden Sie feststellen, dass @FunctionalInterface
beim Kompilieren der Klasse die erwartete Fehlermeldung angezeigt wird:
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
Zuallererst müssen Sie eine gründliche Recherche zu diesem Thema durchführen, und dann sollten Sie auf diese Plattform kommen, um nach Ihrem Problem zu fragen.
Lassen Sie mich dennoch zunächst Ihre Zweifel an der funktionalen Schnittstelle in Java 8 klären
- Die Funktionsschnittstelle in Java 8 kann nur eine abstrakte Methode und eine beliebige Anzahl von Standardmethoden enthalten.
- Ab Java 8 können Lambda-Ausdrücke verwendet werden, um die Instanz einer funktionalen Schnittstelle darzustellen.
- Die Annotation @FunctionalInterface wird verwendet, um sicherzustellen, dass die funktionale Schnittstelle nicht mehr als eine abstrakte Methode haben kann. Wenn mehr als eine abstrakte Methode vorhanden ist, kennzeichnet der Compiler eine
Unexpected @FunctionalInterface annotation
Nachricht. Es ist jedoch nicht zwingend erforderlich, diese Anmerkung zu verwenden.
Nur gemäß Ihrem Code konnte ich zwei abstrakte Methoden sehen, daher ist Ihr Code ungültig .
Ich hoffe das hilft dir irgendwie. Weitere Informationen finden Sie unter folgendem Link: Java 8 Functional Interface