Итак, я бился в отражении Kotlin, и я не могу сделать следующее:
object ThreadState {
sealed class State {
object DANCE : State() {val validEvents: List<ThreadEvent> = listOf(ThreadEvent.Weave, ThreadEvent.Bob)}
object DUCK : State() {val validEvents: List<ThreadEvent> = listOf(ThreadEvent.Weave, ThreadEvent.Bob)}
object DODGE : State() {val validEvents: List<ThreadEvent> = listOf(ThreadEvent.Weave, ThreadEvent.Bob)}
.... Code
}
.... Code
}
То, что я хочу сделать, выглядит примерно так:
val map = ThreadState.State::class.sealedSubclasses.map{ it to it.simpleName}.toMap()
map[ThreadState.State.DODGE]
И пусть он выплевывает простое имя класса (в данном случае DODGE).
Причина в том, что я могу просто повернуть карту и получить значение из имени.Т.е. ThreadState.fromString("DODGE") // ThreadState.State.DODGE
Однако, когда я использую :: sealedSubclasses, он выдает список <KClass <out ThreadState.State>>
Это не Буэно, потому что я не могу на всю жизнь найти способполучить ThreadState.State
обратно из любого данного элемента в списке KClasses.Я попытался запустить it as ThreadState.State
, но он сказал мне, что KClass не может быть приведен к ThreadState.State.
Любая помощь будет высоко ценится.
Короче - есть список запечатанныхклассы, которые являются одноэлементными объектами, содержащими значения.Необходимо составить карту классов, которая соответствует <ThreadState, String>
, где ThreadState является экземпляром ThreadState.State, а строка - просто простым именем класса.
Я действительно открыт для решений - конечноне должно быть отражения, дженерики тоже приветствуются.