Comment créer une instance de classe anonyme de classe abstraite dans Kotlin?

114

Supposons qu'il KeyAdapters'agit d'une classe abstraite avec plusieurs méthodes pouvant être remplacées.

En java, je peux faire:

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

Comment faire de même à Kotlin?

Tvaroh
la source
1
Je n'ai pas voté contre, mais votre question montre très peu d'efforts de recherche. Une simple recherche Google pour les classes anonymes dans Kotlin se présente cette page qui traite - de toutes choses - comment créer l'analogue Kotlin à une classe interne anonyme.
Ted Hopp
5
Je ne fais que commencer par Kotlin. Cette question apparaît comme le premier succès avec une recherche Google très raisonnable. Ce qui était très déroutant pour moi, c'est que le KeyAdapter dans la question est très probablement le java.awt.event.KeyAdapter, qui est une classe abstraite avec 3 méthodes et le simple val k: KeyAdapter = KeyAdapter { println("Hello, world!") }ne fonctionnera pas. (Cependant, je cherchais la syntaxe lambda.) Je pense que je vais chercher une autre question avec ce titre exact, mais une question mieux formulée et lier celle-ci avec un commentaire ...
Peter Lamberg
@PeterLamberg ce n'est pas java.awt c'est l'API des plugins Intellij.
Tvaroh
Cette question apparaît comme un premier succès dans certaines recherches Google pour lesquelles la question pertinente est plus proche de celle-ci, alors je la lie ici
Peter Lamberg
12
Je ne vois pas pourquoi cela est signalé comme trop simple. La question est beaucoup votée, ce qui signifie que beaucoup de gens sont confrontés à ce problème. En raison des différences linguistiques, il n'est pas évident que le premier succès sur Google soit la solution. J'ai parcouru la documentation officielle mais cette question sur SO l'a éclairci.
Muz

Réponses:

178

De la documentation officielle de la langue Kotlin :

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

Appliqué à votre problème actuel:

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

Comme l'a souligné Peter Lamberg - si la classe anonyme est en fait une implémentation d'une interface fonctionnelle ( c'est-à-dire pas d'une classe abstraite ), SAM Conversions peut être utilisé pour simplifier encore plus cette déclaration:

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

Veuillez également noter cette discussion sur les différentes utilisations des interfaces définies dans Java et Kotlin.

Michael Lang
la source