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 } 
  • Tipo no coincidente: ¿tipo inferido es Cadena? pero se esperaba String en kotlin
  • Spring Boot e Hibernate. Manejar la fábrica de sesiones
  • "" Java "" no se reconoce como un command interno o externo, progtwig o file por lotes. en Kotlin
  • Kotlin ve el nombre completo del tipo de object en el estudio de Android en Mac OS
  • ¿Los types reificados de Kotlin son incorrectos para los primitivos en la JVM?
  • Cómo proporcionar datos de testing y classs en proyectos de gradle de varios modules
  • Kotlin getParcelableArray del set de bashs no puede convertirlo en tipo personalizado
  • Smart-cast y comparación dentro de Expression después de 'is' type-check
  • FireStore Transactions incrementa y disminuye el contador obteniendo resultados inconsistentes
  • Es Kotlin más difícil de aplicar ingeniería inversa que Java
  • ¿Cómo evitar types con el mismo conflicto de nombres en Kotlin?