Como criar uma instância de classe anônima de classe abstrata em Kotlin?

113

Suponha que KeyAdapterseja uma classe abstrata com vários métodos que podem ser substituídos.

Em java posso fazer:

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

Como fazer o mesmo em Kotlin?

Tvaroh
fonte
1
Eu não votei negativamente, mas sua pergunta mostra muito pouco esforço de pesquisa. Uma simples busca no Google por classes anônimas em KOTLIN vira para cima desta página que discute - de todas as coisas - como criar o análogo Kotlin para uma classe interna anônima.
Ted Hopp
5
Também estou começando com Kotlin. Esta pergunta surge como a primeira resposta com uma pesquisa no Google bastante razoável. O que foi muito confuso para mim foi que o KeyAdapter em questão é provavelmente o java.awt.event.KeyAdapter, que é uma classe abstrata com 3 métodos e o simples val k: KeyAdapter = KeyAdapter { println("Hello, world!") }não funciona. (No entanto, eu estava procurando a sintaxe lambda.) Acho que vou procurar outra pergunta com este título exato, mas uma pergunta melhor formulada e vincular esta a ela com um comentário ...
Peter Lamberg
@PeterLamberg não é java.awt, é API de plug-ins do Intellij.
Tvaroh
Esta pergunta surge como um hit pela primeira vez em algumas pesquisas do Google para as quais a pergunta relevante está mais perto desta, então estou vinculando-a aqui
Peter Lamberg
12
Não vejo por que isso é sinalizado como muito simples. A questão é muito votada a favor, o que significa que muitas pessoas enfrentam esse problema. Por causa das diferenças de idioma, não é óbvio se o primeiro hit no Google é a solução. Eu dei uma olhada na documentação oficial, mas esta questão no SO esclareceu tudo.
Muz

Respostas:

177

Da documentação oficial do idioma Kotlin :

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

Aplicado ao seu problema em questão:

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

Como Peter Lamberg apontou - se a classe anônima for realmente uma implementação de uma interface funcional ( ou seja, não de uma classe abstrata ), as Conversões de SAM podem ser usadas para simplificar ainda mais esta declaração:

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

Observe também esta discussão sobre o uso diferente de interfaces definidas em Java e Kotlin.

Michael Lang
fonte