Generics Kotlin-提取底层类类型

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

所以,我一直在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<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
(如果该类不是对象声明)。