¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?

En el siguiente código, tengo problemas para organizar la input / salida correctamente de modo que tanto desde () como a () funcionen como se esperaba. Intenté conectar / desconectar tanto las properties como los parameters de la function, pero siempre termino con errores de tipeo incorrectos.

class KStateMachine(private val states: List<StateHandler>) { var currentState: KClass<out StateHandler> private set private val handlers:HashMap<KClass<in StateHandler>, Int> = HashMap() init { currentState = states[0]::class for (i in 0..states.size - 1) { handlers.put(states[i]::class, i) } } fun goto(toState: KClass<in StateHandler>) { var index = handlers.get(toState) if (index != null) { var oldState = currentState currentState = toState states.get(index).from(oldState) } else { throw RuntimeException("to state unknown") } } inline fun <reified T: StateHandler> goto() { goto(T::class) } abstract class StateHandler { abstract fun from(fromState: KClass<in StateHandler>) } } 

Supongo que no necesita las in KClass para KClass es: su código no parece pasar un StateHandler o algo parametrizado con StateHandler en las funciones de KClass .

Si la intención de la variación es que desea que todos los KClass para representar subtypes de StateHandler , entonces podría hacer out proyecciones en todas partes:

 class KStateMachine(private val states: List<StateHandler>) { private var currentState: KClass<out StateHandler> private val handlers: HashMap<KClass<out StateHandler>, Int> = HashMap() init { currentState = states[0]::class for (i in 0..states.size - 1) { handlers.put(states[i]::class, i) } } fun to(toState: KClass<out StateHandler>) { var index = handlers.get(toState) if (index != null) { var oldState = currentState currentState = toState states.get(index).from(oldState) } else { throw RuntimeException("to state unknown") } } abstract class StateHandler { abstract fun from(fromState: KClass<out StateHandler>) } }