Wie erstelle ich eine Instanz einer anonymen Klasse einer abstrakten Klasse in Kotlin?

113

Angenommen, dies KeyAdapterist eine abstrakte Klasse mit mehreren Methoden, die überschrieben werden können.

In Java kann ich:

KeyListener keyListener = new KeyAdapter() {
    @Override public void keyPressed(KeyEvent keyEvent) {
        // ...
    }
};

Wie geht das in Kotlin?

Tvaroh
quelle
1
Ich habe nicht abgelehnt, aber Ihre Frage zeigt sehr wenig Forschungsaufwand. Eine einfache Google-Suche nach anonymen Klassen in Kotlin zeigt diese Seite an, auf der ausgerechnet erläutert wird, wie das Kotlin-Analogon zu einer anonymen inneren Klasse erstellt wird.
Ted Hopp
5
Ich fange auch gerade erst mit Kotlin an. Diese Frage taucht als erster Treffer bei einer sehr vernünftigen Google-Suche auf. Was für mich sehr verwirrend war, war, dass der KeyAdapter in der Frage höchstwahrscheinlich der java.awt.event.KeyAdapter ist, eine abstrakte Klasse mit 3 Methoden und der einfachen Funktion, die val k: KeyAdapter = KeyAdapter { println("Hello, world!") }nicht funktioniert. (Allerdings habe ich nach der Lambda-Syntax gesucht.) Ich denke, ich werde nach einer anderen Frage mit genau diesem Titel suchen, aber nach einer besser formulierten Frage, und diese mit einem Kommentar verknüpfen ...
Peter Lamberg
@PeterLamberg es ist nicht java.awt es ist Intellij Plugins API.
Tvaroh
Diese Frage taucht
Peter Lamberg
12
Ich verstehe nicht, warum dies als zu einfach gekennzeichnet ist. Die Frage wird sehr positiv bewertet, was bedeutet, dass viele Menschen mit diesem Problem konfrontiert sind. Aufgrund der Sprachunterschiede ist nicht klar, ob der erste Treffer bei Google die Lösung ist. Ich habe die offizielle Dokumentation überflogen, aber diese Frage zu SO hat es geklärt.
Muz

Antworten:

176

Aus der offiziellen Kotlin-Sprachdokumentation :

window.addMouseListener(object : MouseAdapter() { 
    override fun mouseClicked(e : MouseEvent) { 
    // ... 
}

Auf Ihr Problem angewendet:

val keyListener = object : KeyAdapter() { 
    override fun keyPressed(keyEvent : KeyEvent) { 
    // ... 
} 

Wie Peter Lamberg betont hat - wenn die anonyme Klasse tatsächlich eine Implementierung einer funktionalen Schnittstelle ( dh nicht einer abstrakten Klasse ) ist, können SAM-Konvertierungen verwendet werden, um diese Aussage noch weiter zu vereinfachen:

val keyListener = KeyAdapter { keyEvent ->
    // ...
}

Bitte beachten Sie auch diese Diskussion über die unterschiedliche Verwendung der in Java und Kotlin definierten Schnittstellen.

Michael Lang
quelle