Jak stworzyć instancję anonimowej klasy abstrakcyjnej w Kotlin?

114

Załóżmy, że KeyAdapterjest to klasa abstrakcyjna z kilkoma metodami, które można przesłonić.

W javie mogę:

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

Jak zrobić to samo w Kotlinie?

Tvaroh
źródło
1
Nie głosowałem przeciw, ale twoje pytanie pokazuje bardzo mały wysiłek badawczy. Proste wyszukiwanie w Google anonimowych klas w kotlin powoduje wyświetlenie tej strony, która omawia - o wszystkim - jak stworzyć analogię Kotlin do anonimowej klasy wewnętrznej.
Ted Hopp,
5
Ja też dopiero zaczynam od Kotlina. To pytanie pojawia się jako pierwsze trafienie z bardzo rozsądnym wyszukiwaniem w Google. To, co było dla mnie bardzo zagmatwane, to fakt, że KeyAdapter w pytaniu to najprawdopodobniej java.awt.event.KeyAdapter, która jest abstrakcyjną klasą z trzema metodami i prostym val k: KeyAdapter = KeyAdapter { println("Hello, world!") }przyzwyczajeniem. (Jednak szukałem składni lambda). Myślę, że będę szukać anoter pytanie o dokładnie takim tytule, ale lepiej sformułowane pytanie i odwołują się do niego ten jeden z komentarzem ...
Peter Lamberg
@PeterLamberg to nie java.awt to API wtyczek Intellij.
Tvaroh,
To pytanie pojawia się jako pierwsze trafienie w niektórych wyszukiwań Google dla których dana kwestia jest bliżej do tego, więc jestem Linkin nim tutaj
Peter Lamberg
12
Nie rozumiem, dlaczego jest to oznaczone jako zbyt proste. To pytanie jest bardzo mile widziane, co oznacza, że ​​wiele osób boryka się z tym problemem. Ze względu na różnice językowe nie jest oczywiste, czy pierwsze trafienie w Google jest rozwiązaniem. Przejrzałem oficjalną dokumentację, ale to pytanie na SO wyjaśniło to.
Muz

Odpowiedzi:

178

Z oficjalnej dokumentacji języka Kotlin :

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

Zastosowany do twojego problemu:

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

Jak zauważył Peter Lamberg - jeśli klasa anonimowa jest w rzeczywistości implementacją interfejsu funkcjonalnego ( tj. Nie jest klasą abstrakcyjną ), konwersje SAM mogą być użyte do dalszego uproszczenia tego stwierdzenia:

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

Proszę również zwrócić uwagę na tę dyskusję na temat różnych zastosowań interfejsów zdefiniowanych w Javie i Kotlin.

Michael Lang
źródło