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?


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.