Как создать экземпляр анонимного класса абстрактного класса в Котлине?

114

Предположим, что KeyAdapterэто абстрактный класс с несколькими методами, которые можно переопределить.

В java я могу:

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

Как сделать то же самое в Котлине?

Тварох
источник
1
Я не голосовал против, но ваш вопрос требует очень мало исследовательских усилий. Простой поиск Google для анонимных классов в Котлин витками вверх этой страницы , которая обсуждает - всех вещей - как создать аналог Котлин для анонимного внутреннего класса.
Тед Хопп
5
Я тоже только начинаю с Котлина. Этот вопрос возникает в первую очередь при разумном поиске в Google. Что меня очень сбивало с толку, так это то, что KeyAdapter в вопросе, скорее всего, java.awt.event.KeyAdapter, который является абстрактным классом с 3 методами, и простой не val k: KeyAdapter = KeyAdapter { println("Hello, world!") }работает. (Однако я искал лямбда-синтаксис.) Думаю, я поищу другой вопрос с таким точным названием, но лучше сформулированный вопрос и свяжу его с комментарием ...
Питер Ламберг,
@PeterLamberg, это не java.awt, это API плагинов Intellij.
Tvaroh 07
Этот вопрос возникает как первое попадание в некоторые поисковые запросы Google, для которых соответствующий вопрос ближе к этому, поэтому я привожу его здесь
Питер Ламберг,
12
Я не понимаю, почему это помечено как слишком простое. За вопрос много голосов, а это значит, что многие люди сталкиваются с этой проблемой. Из-за языковых различий не очевидно, станет ли решение первым попаданием в Google. Я просмотрел официальную документацию, но этот вопрос прояснил это.
Muz

Ответы:

178

Из официальной документации на языке Kotlin :

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

Применяется к вашей проблеме:

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

Как указал Питер Ламберг, если анонимный класс на самом деле является реализацией функционального интерфейса ( т. Е. Не абстрактного класса ), можно использовать преобразования SAM, чтобы еще больше упростить этот оператор:

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

Также обратите внимание на это обсуждение различного использования интерфейсов, определенных в Java и Kotlin.

Майкл Лэнг
источник