package unitcraftcard.test
import java.util.*
import kotlin.reflect.KClass
import kotlin.reflect.jvm.kotlinabstract class Msg
class PrintMsg(val s:String) : Msg()
class MsgRule<in T:Msg>(val prior:Int,val apply: (T) -> Unit)val rulesInfo = HashMap<KClass<out Msg>, MutableList<MsgRule<Msg>>>()
inline fun <reified T:Msg> on(prior: Int, @noinline apply: T.() -> Unit) {
rulesInfo.getOrPut(javaClass<T>().kotlin){ ArrayList<MsgRule<Msg>>() }.add(MsgRule(prior,apply))
}fun main(args: Array<String>) {
on<PrintMsg>(1){
println(s+" 1")
}
on<PrintMsg>(0){
println(s+" 0")
}
val msg = PrintMsg(“hello”)
rulesInfo.values().forEach { it.sortBy{ it.prior } }
rulesInfo[msg.javaClass.kotlin].forEach { it.apply(msg) }
}
How to compile this? I stuck with:
Error:(14, 76) Kotlin: None of the following functions can be called with the arguments supplied:
public abstract fun add(index: kotlin.Int, element: unitcraftcard.test.MsgRule<unitcraftcard.test.Msg>): kotlin.Unit defined in kotlin.MutableList
public abstract fun add(e: unitcraftcard.test.MsgRule<unitcraftcard.test.Msg>): kotlin.Boolean defined in kotlin.MutableList