web-dev-qa-db-de.com

Was ist der Unterschied zwischen Interface und @Interface in Java?

Ich habe Java seit der Verwendung von JBuilder in den späten 90ern während der Universität nicht angefasst, daher bin ich ein wenig außer Kontakt - jedenfalls habe ich diese Woche an einem kleinen Java-Projekt gearbeitet und Intellij IDEA als meine IDE für eine Abwechslung von meiner regulären .Net-Entwicklung.

Ich stelle fest, dass es Unterstützung für das Hinzufügen von Schnittstellen und @ Schnittstellen bietet. Was ist eine @ Schnittstelle und wie unterscheidet sie sich von einer normalen Schnittstelle?

public interface Test {
}

vs.

public @interface Test {
}

Ich habe ein wenig gesucht, konnte aber nicht viele nützliche Informationen zu @interface finden.

242
Bittercoder

Das Symbol @ kennzeichnet eine Definitionstypenbeschreibung.

Das heißt, es ist nicht wirklich eine Schnittstelle, sondern eher ein neuer Annotationstyp, der als Funktionsmodifikator verwendet wird, wie zum Beispiel @override.

Sehen Sie dieses Javadocs-Eintrag zum Betreff.

262
mrkishi

schnittstelle:

Im Allgemeinen macht eine Schnittstelle einen Vertrag verfügbar, ohne die zugrunde liegenden Implementierungsdetails anzuzeigen. In der objektorientierten Programmierung definieren Schnittstellen abstrakte Typen, die Verhalten offenlegen, aber keine Logik enthalten. Die Implementierung wird durch die Klasse oder den Typ definiert, der die Schnittstelle implementiert.

@Interface: (Annotationstyp)

Nehmen Sie das Beispiel unten, das viele Kommentare enthält:

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

Anstelle dessen können Sie einen Annotationstyp angeben

 @interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

die dann eine Klasse wie folgt kommentieren kann: 

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

PS: Viele Anmerkungen ersetzen Kommentare im Code.

Referenz: http://docs.Oracle.com/javase/tutorial/Java/annotations/declaring.html

89
mavis

Das Schlüsselwort interface gibt an, dass Sie eine traditionelle Schnittstellenklasse in Java deklarieren.
Das Schlüsselwort @interface wird zum Deklarieren eines neuen Annotationstyps verwendet. 

Eine Beschreibung der Syntax finden Sie in docs.Oracle Tutorial über Annotationen.
Sehen Sie sich die JLS an, wenn Sie wirklich wissen wollen, was @interface bedeutet.

31
DavidValeri

interface: definiert den Vertrag für eine Klasse, die ihn implementiert

@interface: definiert den Vertrag für eine Anmerkung 

13
eosimosu

interface in der Java-Programmiersprache ist ein abstrakter Typ, mit dem ein Verhalten angegeben wird, das Klassen implementieren müssen. Sie ähneln Protokollen. Schnittstellen werden mit dem Schnittstellenschlüsselwort deklariert

@interface dient zum Erstellen eigener (benutzerdefinierter) Java-Anmerkungen. Annotationen werden in einer eigenen Datei definiert, genau wie eine Java-Klasse oder -Schnittstelle. Hier ist ein Beispiel für eine benutzerdefinierte Java-Anmerkung:

@interface MyAnnotation {

    String   value();

    String   name();
    int      age();
    String[] newNames();

}

In diesem Beispiel wird eine Annotation mit dem Namen MyAnnotation definiert, die vier Elemente enthält. Beachten Sie das @interface-Schlüsselwort. Dies signalisiert dem Java-Compiler, dass es sich um eine Java-Anmerkungsdefinition handelt.

Beachten Sie, dass jedes Element ähnlich einer Methodendefinition in einer Schnittstelle definiert ist. Es hat einen Datentyp und einen Namen. Sie können alle primitiven Datentypen als Elementdatentypen verwenden. Sie können auch Arrays als Datentyp verwenden. Sie können keine komplexen Objekte als Datentyp verwenden.

Um die obige Annotation zu verwenden, können Sie Code wie folgt verwenden:

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

Referenz - http://tutorials.jenkov.com/Java/annotations.html

0
Piyush Singh