wake-up-neo.net

Java: Schnittstelle mit neuem Schlüsselwort Wie ist das möglich?

Ich habe Quellcode aus Java-Bibliotheken gelesen und bin hier verwirrt.

Dieser Code stammt aus Document.Java in der jaxb-Bibliothek. ContentVisitor ist eine Schnittstelle im selben Paket. Wie können wir eine Instanz der Schnittstelle mit einem neuen Schlüsselwort erstellen? ist das nicht illegal?

public final class Document {
.
.
 private final ContentVisitor visitor = new ContentVisitor() {
    public void onStartDocument() {

        throw new IllegalStateException();
    }

    public void onEndDocument() {
        out.endDocument();
    }

    public void onEndTag() {
        out.endTag();
        inscopeNamespace.popContext();
        activeNamespaces = null;
    }
}
50
user893334

Im Code erstellen Sie keine Instanz der Schnittstelle. Der Code definiert vielmehr eine anonyme Klasse, die die Schnittstelle implementiert und diese Klasse instantiiert.

Der Code entspricht in etwa:

public final class Document {

    private final class AnonymousContentVisitor implements ContentVisitor {

        public void onStartDocument() {
            throw new IllegalStateException();
        }

        public void onEndDocument() {
            out.endDocument();
        }

        public void onEndTag() {
            out.endTag();
            inscopeNamespace.popContext();
            activeNamespaces = null;
        }
    }

    private final ContentVisitor visitor = new AnonymousContentVisitor();
}
50
NPE

Es ist gültig Es heißt anonyme Klasse. Siehe hier

Wir haben bereits Beispiele für die Syntax zur Definition und Instanziierung einer anonymen Klasse gesehen. Wir können diese Syntax formeller ausdrücken als:

new class-name ( [ argument-list ] ) { class-body }

oder:

new interface-name () { class-body }
11
Nishant

Es heißt anonymous type/class, die dieses Interface implementiert. Schauen Sie sich Tutorial - Lokale und anonyme Innere Klassen an.

2
adatapost

Diese Deklaration erstellt tatsächlich eine neue anonyme Klasse, die die ContentVisitor-Schnittstelle und dann ihre Instanz für den angegebenen Bereich implementiert und vollkommen gültig ist.

1

Es gibt etwas namens anonyme Klasse in Java http://www.Java2s.com/Code/Java/Class/Anonymous-class.htm

0
naresh

Stellen Sie fest, wo sich die Klammern öffnen - Sie deklarieren ein inneres Objekt (genannt anonymous class), das ContentVisitor und alle erforderlichen Methoden sofort implementiert!

0
Marcelo

Es ist eine Inline-Schnittstellenimplementierung. Hier soll der Compiler eine anonyme Klasse generieren, die die Schnittstelle implementiert. Für jede in der Schnittstelle definierte Methode können Sie (optional) eine Methode mit einer geeigneten Signatur angeben, die als Implementierung der Methode der Schnittstelle verwendet wird.

Es ist die neue Oxygene-Syntax, die der Sprache hinzugefügt wurde, damit Oxygene-Programmierer mit diesen schnittstellenbasierten Ereignissen auf ähnliche Weise wie Java-Programmierer arbeiten können.

0
Shashank Kadne

Sie haben die Implementierung dieser Schnittstelle gerade anonym bereitgestellt. Dies ist durchaus üblich und natürlich möglich. Schauen Sie hier für weitere Informationen.

0
Kris