Как сделать вывод типа Котлин из отражения KClass?

В приведенном ниже коде у меня возникли проблемы с правильной настройкой ввода / вывода, так что как из (), так и () работают должным образом. Я попытался включить / отключить как свойства, так и функциональные параметры, но всегда получаю неправильные ошибки ввода.

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>) } } 

Я полагаю, вам вообще не нужны inKClass для KClass es: ваш код, похоже, не передает StateHandler или что-то параметризуемое с помощью StateHandler в функции KClass .

Если намерение отклонения состоит в том, что вы хотите, чтобы все KClass es представляли подтипы StateHandler , вы могли бы делать внепроекты везде:

 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>) } }