Declarar Literales de Función con parameters de input generics en Kotlin

No sé cómo especificar un literal de function donde el parámetro de input puede covary para que el literal de la function pueda tener asignadas funciones que acepten subtypes del tipo de input.

El ejemplo más simple que se me ocurre es que quiero hacer algo como esto:

var f: (Number) -> Unit = { number: Number -> println(number) } f = {int: Int -> println(number) } // <-- this does not compile 

Estas declaraciones no funcionan:

 var f: (in Number) -> Unit = {number: Number ->} // doesn't compile var f: (out Number) -> Unit = {number: Number ->} // doesn't compile var f: <N: Number> (N) -> Unit = {number: Number ->} // ridiculous 

Aquí está el context de lo que REALMENTE quiero hacer. Quiero crear una class sencilla de controller de events.

Este es mi código de Kotlin:

 class EventHandler() { private val NO_OP = {event: Event -> } private val handlerMap = mutableMapOf<KClass<out Event>, (Event) -> Unit>() // here is the problem declaration fun <E: Event> registerHandler( eventClass: KClass<out E>, handler: (E) -> Unit) { handlerMap[eventClass] = handler // this doesn't compile } fun handle(event: Event) = getHandler(event).invoke(event) fun getHandler(event: Event): (Event) -> Unit = handlerMap[event::class] ?: NO_OP } 

El handlerMap[eventClass] = handler no se comstack, porque el handlerMap acepta como valores (Event) -> Unit , y el tipo del handler es (E) -> Unit donde E es un parámetro de tipo que extiende Evento ( <E: Event> ).

El post de error es:

 Events.kt:[18,9] Type inference failed: Cannot infer type parameter V in operator inline fun <K, V> MutableMap<K, V>.set(key: K, value: V): Unit None of the following substitutions receiver: MutableMap<KClass<out Event>, (Event) -> Unit> arguments: (KClass<out Event>,(Event) -> Unit) receiver: MutableMap<KClass<out Event>, (E) -> Unit> arguments: (KClass<out Event>,(E) -> Unit) can be applied to receiver: MutableMap<KClass<out Event>, (Event) -> Unit> arguments: (KClass<out E>,(E) -> Unit) 

Estoy usando kotlin-maven-plugin: 1.1-M03.

Ok, no pensé en esto antes, pero parece que puedes convertir la Función al tipo del literal.

En otras palabras, puedes hacer esto

 var f: (Number) -> Unit = { number: Number -> println(number) } f = {int: Int -> println(number) } as (Number) -> Unit 

Para mi uso real, haría que la function registerHandler viera así:

 fun <E: Event> registerHandler(eventClass: KClass<out E>, handler: (E) -> Unit) { handlerMap[eventClass] = handler as (Event) -> Unit } 
  • Cómo evitar la verificación nula networkingundante (advertencia FindBugs) en el campo de Kotlin
  • Generando comentarios de método / class de Kotlin
  • ¿Cómo llamar a una function de JavaScript de Kotlin que espera un object jQuery ajax settings?
  • No se pudo encontrar la class databinding.FragmentBinding
  • Botón Kotlin / Anko enHaga clic en no funcionar
  • ¿Cómo llamo a un método en Kotlin con un límite superior diferente?
  • Cómo mapear java.util.Optional <Something> a algo? en Kotlin
  • Kotlin Coroutines en un service de Android
  • Lista vista: desplazamiento suave hacia abajo
  • Cómo vincular la vista en RecyclerView.ViewHolder con kotlin
  • Anko ignorando layout_margin definido en estilo