2013-07-07 18 views
46

Angenommen, KeyAdapter ist eine abstrakte Klasse mit mehreren Methoden, die überschrieben werden können.Wie erstellt man eine Instanz der anonymen Klasse der abstrakten Klasse in Kotlin?

In Java kann ich tun:

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

, wie selbige in Kotlin zu tun?

+0

Ich habe nicht downvote, aber Ihre Frage zeigt sehr wenig Forschungsaufwand. Eine einfache Google-Suche nach _anonymous classes in kotlin_ taucht auf [diese Seite] (http://blog.jetbrains.com/kotlin/2013/02/kotlin-m5-1/), die - aus allen Dingen - wie diskutiert erstelle das Kotlin-Analogon zu einer anonymen inneren Klasse. –

+0

Ich fange gerade auch mit Kotlin an. Diese Frage kommt als erster Hit mit 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 dem einfachen 'val k: KeyAdapter = KeyAdapter { println (" Hallo, Welt! ") }' 'Arbeit nicht. (Ich habe jedoch nach der Lambda-Syntax gesucht.) Ich denke, ich werde mit diesem genauen Titel nach einer anderen Frage suchen, aber nach einer besser formulierten Frage und verlinke diese mit einem Kommentar ... –

+0

@PeterLamberg es ist nicht java.awt Es ist Intellij Plugins API. – Tvaroh

Antwort

88

Von the first hit on Google:

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

auf Ihr Problem auf der Hand Beworben:

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

Wie Peter Lamberg hat darauf hingewiesen -, wenn die anonyme Klasse tatsächlich eine Implementierung einer funktionalen Schnittstelle (dh nicht von einer abstrakten Klasse), SAM Conversions kann verwendet werden, um diese Aussage noch weiter zu vereinfachen:

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

Bitte beachten Sie auch this discussion über die unterschiedliche Verwendung von Schnittstellen in Java und Kotlin definiert.

+1

wo 'object' ein Schlüsselwort ist (offensichtlicher bei der gegebenen Verknüpfung als bei der SO-Syntax-Hervorhebung). – ataulm

+0

Vielen Dank dafür, ohne das Objekt-Schlüsselwort hat es nicht funktioniert. Ich konnte meinen 'OnPageChangeListener' für meinen ViewPager erstellen. –

Verwandte Themen