Warum gibt es keinen Kompilierungsfehler für mein @FunctionalInterface mit zwei Methoden?


8

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?


Warum gibt es mir keinen Fehler
Nitin T

Könnten Sie bitte Ihre Protokolle der Plattform teilen, auf der Sie Ihren Code ausführen?
Alok

1
Interessante Frage. Ich verstehe die engen Abstimmungen nicht. Aber Nitin, bitte lerne, wie man gute Fragen schreibt. Schreiben Sie nicht nur eine Postleitzahl, sondern fügen Sie auch die eigentliche Frage in Ihren Text ein, nicht in die Überschrift oder nur in einen Kommentar. Bearbeiten Sie Fragen, anstatt sie zu kommentieren, wenn Sie der Frage etwas hinzufügen möchten. Ich werde das diesmal für dich tun. Bitte beachten Sie auch, wie Sie Codeblöcke verwenden. Ich habe auch Ihre Code-Formatierung korrigiert.
Kriegaex

Kurzum: Transitive Deklaration von Methoden.
Vishwa Ratna

Antworten:


10

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 Normalkann 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, publicda 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 toStringin etwas anderes ändern , z. B. toStringXwerden Sie feststellen, dass @FunctionalInterfacebeim 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

Tolle Antwort Kriegaex.
Alok

1
Tolle Erklärung, +1
Sandeep Tiwari

-1

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

  1. Die Funktionsschnittstelle in Java 8 kann nur eine abstrakte Methode und eine beliebige Anzahl von Standardmethoden enthalten.
  2. Ab Java 8 können Lambda-Ausdrücke verwendet werden, um die Instanz einer funktionalen Schnittstelle darzustellen.
  3. 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 annotationNachricht. 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


1
Obwohl Sie meine Frage nicht verstanden haben, ob @FunctionalInterface dem Compiler sicherstellt, dass meine Schnittstelle nur eine abstrakte Methode haben sollte, warum der obige Code mir keinen Fehler bei der Kompilierungszeit gibt, brauche ich nur eine Antwort darauf
Nitin T

@NitinT, sehen Sie in Ihrer Problemstellung, was Sie gültig geschrieben haben oder nicht . Ich habe darauf basierend eine Antwort gegeben. Bitte recherchieren Sie, um Fragen zu StackOverFlow zu stellen.
Alok
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.