148 votes

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

Supposons que KeyAdapter est une classe abstraite avec plusieurs méthodes qui peuvent être surchargées.

En java, je peux le faire :

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

Comment faire la même chose en Kotlin ?

224voto

Michael Lang Points 2745

De la documentation officielle du langage 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 ), Conversions SAM 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 en Java et en Kotlin.

5voto

mightyWOZ Points 405

En Java

private Comparator<Integer> comparator = new Comparator<Integer>(){
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
};

en Kotlin

private val comparator = object: Comparator<Int> {
    override fun compare(o1: Int, o2: Int): Int {
        return o1.compareTo(o2)
    }
}

Mais parce que Comparateur est un Interface fonctionnelle nous pouvons tirer parti de Conversions SAM et écrire

private val comparator = Comparator<Int> { o1, o2 -> o1.compareTo(o2) }

Veuillez noter que la fonction SAM ne fonctionne que pour Functional interfaces définies en java, si vous avez besoin de créer des object d'un kotlin interface avec une seule méthode, vous devrez utiliser object la syntaxe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X