Generics Kotlin-提取底层类类型
所以,我一直在Kotlin reflection中闲逛,我似乎无法做到以下几点:Generics Kotlin-提取底层类类型,generics,reflection,kotlin,Generics,Reflection,Kotlin,所以,我一直在Kotlin reflection中闲逛,我似乎无法做到以下几点: object ThreadState { sealed class State { object DANCE : State() {val validEvents: List<ThreadEvent> = listOf(ThreadEvent.Weave, ThreadEvent.Bob)} object DUCK : State() {val validEvents: List<Thr
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
}
sealed class State {
open val validEvents : List<ThreadEvent> = emptyList()
// and then of course the subclasses need to override it:
object DANCE : State() {override val validEvents: List<ThreadEvent> = listOf(ThreadEvent.Weave, ThreadEvent.Bob)}
并让它说出类的简单名称(在本例中为DODGE)
原因是我可以简单地反转映射并从名称中获取一个值。即ThreadState.fromString(“DODGE”)//ThreadState.State.DODGE
但是,当我使用::sealedsubclass时,它给出了
这不是bueno,因为我一辈子都找不到从KClass列表中的任何给定元素中获取ThreadState.State
的方法。我试图以ThreadState.State运行它,但它告诉我不能将KClass转换为ThreadState.State
任何帮助都将不胜感激
简言之-有一个密封类的列表,这些类是保存值的单例对象。需要创建符合
的类的映射,其中ThreadState是ThreadState.State的实例,字符串只是类的简单名称
我对解决方案非常开放-当然不必是反射,也欢迎泛型。如何map[ThreadState.State.DODGE::class]
?或者它不适用于您吗?那么映射[ThreadState.State.DODGE::class]
呢?还是不适用于您?给您:
val stateMap = ThreadState.State::class.sealedSubclasses.asSequence()
.map { it.simpleName to it.objectInstance } // note the objectInstance call
.toMap()
另请注意以下文件:
对象声明的实例,如果此类不是对象声明,则为null
出于测试目的,我在状态
-类中添加了以下函数:
fun printMe() = println("class: ${this::class.simpleName} object: $this")
现在,您可以按如下方式访问对象:
stateMap["DODGE"]?.printMe()
// will then print the same as:
ThreadState.State.DODGE.printMe()
我怀疑走这条路是否值得,但你知道这个用例,我不。。。也许类似的东西对你也有用
但是:如果要访问validEvents
,则需要确保它也是状态
-类本身的一部分,即,您可能需要添加以下内容:
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
}
sealed class State {
open val validEvents : List<ThreadEvent> = emptyList()
// and then of course the subclasses need to override it:
object DANCE : State() {override val validEvents: List<ThreadEvent> = listOf(ThreadEvent.Weave, ThreadEvent.Bob)}
给你:
val stateMap = ThreadState.State::class.sealedSubclasses.asSequence()
.map { it.simpleName to it.objectInstance } // note the objectInstance call
.toMap()
另请注意以下文件:
对象声明的实例,如果此类不是对象声明,则为null
出于测试目的,我在状态
-类中添加了以下函数:
fun printMe() = println("class: ${this::class.simpleName} object: $this")
现在,您可以按如下方式访问对象:
stateMap["DODGE"]?.printMe()
// will then print the same as:
ThreadState.State.DODGE.printMe()
我怀疑走这条路是否值得,但你知道这个用例,我不。。。也许类似的东西对你也有用
但是:如果要访问validEvents
,则需要确保它也是状态
-类本身的一部分,即,您可能需要添加以下内容:
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
}
sealed class State {
open val validEvents : List<ThreadEvent> = emptyList()
// and then of course the subclasses need to override it:
object DANCE : State() {override val validEvents: List<ThreadEvent> = listOf(ThreadEvent.Weave, ThreadEvent.Bob)}
State
应该如何成为ThreadState
的实例?我不太确定我是否理解这个问题。例如,ThreadState.State.Dance将允许访问该类的数据,还可以用作枚举。ThreadState
是一个对象State
是ThreadState
的一个内部类。。。否则两者之间就没有任何关系了。。。因此,您可能更希望将String
映射到ThreadState.State
或反之……您希望获取实际对象吗?比如State.DODGE
,State.DUCK
或者您想获取对象的类吗Sealed子类
提供了它的类,而不是对象…@Roland我觉得很傻。我想获取继承State类的实际对象。State
应该如何成为ThreadState
的实例?我不太清楚这个问题。例如,ThreadState.State.Dance将允许访问该类的数据,还可以用作枚举。ThreadState
是一个对象State
是ThreadState
的一个内部类。。。否则两者之间就没有任何关系了。。。因此,您可能更希望将String
映射到ThreadState.State
或反之……您希望获取实际对象吗?比如State.DODGE
,State.DUCK
或者您想获取对象的类吗Sealed子类
提供了它的类,而不是对象…@Roland我觉得很傻。我想得到继承State类的实际对象。不,它完全有效。当我这样做并反转贴图时,即使我返回对象,我也无法再访问它的字段。i、 e.ThreadState.fromString(“道奇”).validvents validvents已经不存在了。@JapanRob我可能不太清楚这里的问题是什么。fromString
方法做什么?是否只有当
语句返回实例时才是?什么意思是validEvents不再存在了?没关系,我得到了答案。谢谢你!我对你的回答投了赞成票,因为语法是正确的。不,它完全有效。当我这样做并反转贴图时,即使我返回对象,我也无法再访问它的字段。i、 e.ThreadState.fromString(“道奇”).validvents validvents已经不存在了。@JapanRob我可能不太清楚这里的问题是什么。fromString
方法做什么?是否只有当
语句返回实例时才是?什么意思是validEvents不再存在了?没关系,我得到了答案。谢谢你!我对你的回答投了赞成票,因为语法是正确的。你怎么知道要把它变成一个对象实例呢?老实说:我猜。。。但是,如果您查找,就会清楚:对象声明的实例,或者null
如果该类不是对象声明。whoaaaaa这是完美的。你怎么知道要把它变成一个对象实例呢?老实说:我猜。。。但是,如果您查找,就会清楚:对象声明的实例,或者null
(如果该类不是对象声明)。