2017-08-15 19 views
1

在下面的代码中,我无法正确安排输入/输出,以至于()和()都按预期工作。我试过在属性和函数参数中切入/切出,但总是以不正确的键入错误结束。如何从KClass反射中进行Kotlin类型推断?

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

回答

1

我想你不需要in -projections在所有的KClass ES:你的代码似乎并没有传递StateHandler或向KClass功能参数化的东西用StateHandler

如果差异的意图是希望所有KClass ES代表的StateHandler亚型,那么你可以做out -projections无处不在:

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

正是我需要的,谢谢! – Martin