Come creare un'istanza di classe anonima di classe astratta in Kotlin?


114

Supponiamo che KeyAdaptersia una classe astratta con diversi metodi che possono essere sovrascritti.

In java posso fare:

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

Come fare lo stesso a Kotlin?


1
Non ho votato negativamente, ma la tua domanda mostra uno sforzo di ricerca minimo. Una semplice ricerca su Google per classi anonime in kotlin fa apparire questa pagina che discute - di tutte le cose - come creare l'analogo di Kotlin a una classe interna anonima.
Ted Hopp

5
Inoltre sto appena iniziando con Kotlin. Questa domanda si presenta come il primo successo con una ricerca su Google molto ragionevole. Ciò che mi ha molto confuso è che il KeyAdapter nella domanda è molto probabilmente java.awt.event.KeyAdapter, che è una classe astratta con 3 metodi e il semplice val k: KeyAdapter = KeyAdapter { println("Hello, world!") }non funzionerà. (Comunque stavo cercando la sintassi lambda.) Penso che cercherò un'altra domanda con questo titolo esatto, ma una domanda formulata meglio e collegherò questa ad essa con un commento ...
Peter Lamberg

@PeterLamberg non è java.awt è l'API dei plugin di Intellij.
Tvaroh

Questa domanda si presenta come un primo successo in alcune ricerche su Google per le quali la domanda pertinente è più vicina a questa, quindi la collego qui
Peter Lamberg,

12
Non vedo perché questo sia contrassegnato come troppo semplice. La domanda è molto votata, il che significa che molte persone affrontano questo problema. A causa delle differenze linguistiche, non è ovvio se il primo successo su Google sia la soluzione. Ho passato in rassegna la documentazione ufficiale ma questa domanda su SO ha chiarito tutto.
Muz

Risposte:


178

Dalla documentazione ufficiale in lingua Kotlin :

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

Applicato al tuo problema a portata di mano:

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

Come ha sottolineato Peter Lamberg, se la classe anonima è in realtà un'implementazione di un'interfaccia funzionale ( cioè non di una classe astratta ), le conversioni SAM possono essere utilizzate per semplificare ulteriormente questa affermazione:

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

Si prega di notare anche questa discussione sul diverso utilizzo delle interfacce definite in Java e Kotlin.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.