2013-07-07 26 views
46

Załóżmy, że KeyAdapter jest klasą abstrakcyjną z kilkoma metodami, które można przesłonić.Jak stworzyć instancję anonimowej klasy abstrakcyjnej w Kotlin?

w Javie można zrobić:

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

Jak zrobić to samo w Kotlin?

+0

Nie przesłałem, ale twoje pytanie pokazuje bardzo niewiele wysiłku badawczego. Pojawia się proste wyszukiwanie w Google dla _anonimowych klas w kotlin_ [tej stronie] (http://blog.jetbrains.com/kotlin/2013/02/kotlin-m5-1/), które omawia - o wszystkim - jak utwórz analog Kotlina do anonimowej klasy wewnętrznej. –

+0

Zaczynam też z Kotlinem. To pytanie pojawia się jako pierwsze trafienie w bardzo rozsądne wyszukiwanie google. Co było dla mnie bardzo kłopotliwe, to że KeyAdapter w pytaniu jest najprawdopodobniej java.awt.event.KeyAdapter, który jest abstrakcyjną klasą z 3 metodami i prostym 'val k: KeyAdapter = KeyAdapter { println (" Witaj, świat! ") }' 'nie działa. (Szukałem jednak składni lambda.) Myślę, że będę szukał anotycznego pytania z tym dokładnym tytułem, ale lepiej sformułowane pytanie i link to do niego z komentarzem ... –

+0

@PeterLamberg to nie java.awt to API wtyczek Intellij. – Tvaroh

Odpowiedz

88

Od the first hit on Google:

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

zastosowaniu do problemu pod ręką:

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

Jak Peter Lamberg podkreślił - jeśli anonimowy klasa jest faktycznie implementacja interfejsu funkcjonalnego (tj. Nie z abstrakcyjnej klasy), SAM Conversions może być użyte do uproszczenia tego oświadczenia jeszcze bardziej:

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

Należy również zwrócić uwagę na this discussion dotyczące różnych zastosowań interfejsów zdefiniowanych w Javie i Kotlin.

+1

gdzie 'object' jest słowem kluczowym (bardziej oczywiste pod danym linkiem niż z podświetlaniem składni SO). – ataulm

+0

Dziękuję za to, bez słowa kluczowego obiektu nie działa. Byłem w stanie stworzyć moje 'OnPageChangeListener' dla mojego ViewPagera. –