Як створити екземпляр анонімного класу абстрактного класу в Котліні?


114

Припустимо, що KeyAdapterце абстрактний клас з кількома методами, які можна перекрити.

У Java я можу:

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

Як зробити те ж саме в Котліні?


1
Я не заявив, але ваше запитання показує дуже мало зусиль для дослідження. Простий пошук Google в анонімних класах у kotlin з'являється на цій сторінці, де обговорюється - з усього іншого - як створити аналог Котліна до анонімного внутрішнього класу.
Тед Хопп

5
Я також тільки починаю з Котліна. Це питання постає як перший удар при дуже розумному пошуку в Google. Що мене дуже заплутало, це те, що KeyAdapter у питанні, швидше за все, java.awt.event.KeyAdapter, який є абстрактним класом з 3-ма методами та простою val k: KeyAdapter = KeyAdapter { println("Hello, world!") }роботою звички . (Однак я шукав синтаксис лямбда.) Думаю, я буду шукати інше питання з таким точним заголовком, але краще сформульоване питання і зв’яжу це питання з коментарем ...
Пітер Ламберг

@PeterLamberg це не java.awt це API плагінів Intellij.
Tvaroh

Це питання виникає як перший удар у деяких пошуках Google, для яких відповідне питання ближче до цього, тому я тут посилаюсь на це
Пітер Ламберг

12
Я не бачу, чому це позначено як занадто просто. Питання викликає багато питань, тобто багато людей стикаються з цією проблемою. Через мовні відмінності не очевидно, чи є першим ударом у Google рішення. Я переглянув офіційну документацію, але це запитання на ПО було прояснено.
Муз

Відповіді:


178

З офіційної документації з мови Котліна :

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

Застосовується до вашої проблеми:

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

Як зазначив Пітер Ламберг - якщо анонімний клас насправді є реалізацією функціонального інтерфейсу ( тобто не абстрактного класу ), SAM Conversions можна використовувати для спрощення цього твердження ще більше:

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

Зверніть увагу також на цю дискусію щодо різного використання інтерфейсів, визначених у Java та Kotlin.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.