¿Cómo crear una instancia de clase anónima de clase abstracta en Kotlin?

114

Suponga que KeyAdapteres una clase abstracta con varios métodos que se pueden anular.

En java puedo hacer:

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

¿Cómo hacer lo mismo en Kotlin?

Tvaroh
fuente
1
No voté en contra, pero su pregunta muestra muy poco esfuerzo de investigación. Una simple búsqueda en Google de las clases anónimas en Kotlin vueltas hasta esta página que trata - de todas las cosas - cómo crear el análogo Kotlin a una clase interna anónima.
Ted Hopp
5
También estoy comenzando con Kotlin. Esta pregunta surge como el primer acierto con una búsqueda de Google muy razonable. Lo que fue muy confuso para mí fue que el KeyAdapter en la pregunta probablemente sea el java.awt.event.KeyAdapter, que es una clase abstracta con 3 métodos y el simple val k: KeyAdapter = KeyAdapter { println("Hello, world!") }no funcionará. (Sin embargo, estaba buscando la sintaxis lambda.) Creo que buscaré otra pregunta con este título exacto, pero una pregunta mejor formulada y vincularé esta con un comentario ...
Peter Lamberg
@PeterLamberg no es java.awt, es la API de complementos de Intellij.
Tvaroh
Esta pregunta surge como un primer resultado en algunas búsquedas de Google para las cuales la pregunta relevante está más cerca de esto, así que la estoy vinculando aquí
Peter Lamberg
12
No veo por qué esto se marca como demasiado simple. La pregunta se vota mucho, lo que significa que muchas personas enfrentan este problema. Debido a las diferencias de idioma, no es obvio si el primer éxito en Google es la solución. Hojeé la documentación oficial pero esta pregunta sobre SO lo aclaró.
Muz

Respuestas:

178

De la documentación oficial del idioma de Kotlin :

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

Aplicado a su problema en cuestión:

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

Como ha señalado Peter Lamberg, si la clase anónima es en realidad una implementación de una interfaz funcional ( es decir, no de una clase abstracta ), SAM Conversions se puede utilizar para simplificar aún más esta declaración:

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

Tenga en cuenta también esta discusión sobre el uso diferente de las interfaces definidas en Java y Kotlin.

Michael Lang
fuente