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?


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.