2017-08-15 20 views
1

以下のコードでは、from()とto()の両方が期待どおりに動作するように入出力を正しく配置するのに問題があります。私は両方のプロパティと関数のパラメータの切り替えを試みましたが、常に誤った入力エラーで終わります。KClの反射から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

私はあなたがKClass ESの全てでin -projectionsを必要としないと仮定します。あなたのコードが通過していないようですStateHandlerまたはKClassの機能にでStateHandlerでパラメータ何か。

分散の意図は、あなたがStateHandlerのサブタイプを表すために、すべてのKClass ESをしたいということであれば、あなたはどこにでも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