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

Tengo una biblioteca Java de terceros que tiene un object con una interfaz como esta:

public interface Handler<C> { void call(C context) throws Exception; } 

¿Cómo puedo implementarlo concisamente en Kotlin similar a una class anónima de Java como esta?

 Handler<MyContext> handler = new Handler<MyContext> { @Override public void call(MyContext context) throws Exception { System.out.println("Hello world"); } } handler.call(myContext) // Prints "Hello world" 

Suponiendo que la interfaz tiene solo un método, puede usar SAM

 val handler = Handler<String> { println("Hello: $it")} 

Si tiene un método que acepta un controller, puede incluso omitir los arguments de tipo:

 fun acceptHandler(handler:Handler<String>){} acceptHandler(Handler { println("Hello: $it")}) acceptHandler({ println("Hello: $it")}) acceptHandler { println("Hello: $it")} 

Si la interfaz tiene más de un método, la syntax es un poco más detallada:

 val handler = object: Handler2<String> { override fun call(context: String?) { println("Call: $context") } override fun run(context: String?) { println("Run: $context") } } 

La respuesta más simple probablemente sea la lambda de Kotlin:

 val handler = Handler<MyContext> { println("Hello world") } handler.call(myContext) // Prints "Hello world" 
  • Cómo verificar el vacío lambda en kotlin
  • Kotlin: uso ilegal de devolución de parameters en línea
  • Pase la interfaz como parámetro en Kotlin
  • Kotlin y Jack no son compatibles (Android Studio 2.3.2)
  • Expresiones de kotlin lambda como parámetro opcional
  • Cómo escribir el generador HTML correcto en Kotlin
  • Kotlin, Proguard y lambdas
  • Enlace de datos: el campo Observable con valor lambda no comstack
  • Configuración de oyentes de Android en Kotlin: uso del retorno en lambdas
  • Kotlin, tabla / matriz basada en inputs con campos dynamics
  • ¿Cómo omitir los parameters lambda en Kotlin?