Kotlin-在运行时确定嵌套泛型类型
我的解决方案中有以下类Kotlin-在运行时确定嵌套泛型类型,kotlin,Kotlin,我的解决方案中有以下类 开放类状态{…} 类CustomState:状态{…} 抽象类FindState{…} 类FindStateImpl:FindState(){…} FindState可以这样调用 val strState=FindStateImpl(…) val intState=FindStateImpl(…) val customState=FindStateImpl(…) 在运行时,我需要从FindState类中获取以下类的类型: T在FindState中,它将是状态或其衍生
开放类状态{…}
类CustomState:状态{…}
抽象类FindState{…}
类FindStateImpl:FindState(){…}
FindState
可以这样调用
val strState=FindStateImpl(…)
val intState=FindStateImpl(…)
val customState=FindStateImpl(…)
在运行时,我需要从FindState
类中获取以下类的类型:
在T
中,它将是FindState
或其衍生物状态
处于T
状态
val strState=FindStateImpl(…)
//State::class.java
//String::class.java
val intState=FindStateImpl(…)
//State::class.java
//Int::class.java
val customState=FindStateImpl(…)
//CustomState::class.java
//BigDecimal::class.java(因为string是底层类型T)
到目前为止,我已经得到了类似的东西,但它很可怕,不能完全工作:
val stateType=javaClass.kotlin.supertypes[0]。参数[0]。类型?.jvmErasure?.javaObjectType
有可能在运行时获得这些类型吗?您提供的代码根本不包含所需的类型信息,因为它将被擦除。只有将特定类型指定为超类型一部分的子类型才可用 对于kotlin,有两种方法可以检索类型信息:
TypeToken
这样的模式,并确保提供包含所需类型信息的匿名对象。这将使反射代码正常工作typeOf()
方法嵌入KType
:findstatembeddype(状态:CS):FindState{
val contentType=typeOf();
//使用T执行您需要执行的操作,可能嵌入到包装器FindState类型中
返回FindStateImpleWithType(状态,contentType)
}
关于为什么我们在JVM@szymon_prz上有这种形式的泛型,有一本很好的读物。很遗憾,该页面上没有评论部分… 即使你接受了近二十年前所做决定的所有理由(其中一些确实很有道理),也不一定证明从那以后所做的事情能够减轻一些痛苦(即:什么都没有)。@gidds是的,我们知道这个主题现在已经被抛在脑后,我们没有任何其他改进,但是我们在其他领域也得到了很多其他的改进,因为泛型的下一步改进并不是社区和公司所需要的,也不是JVM或Java的其他部分所需要的,我相信您也会对泛型之后所做的一些改进感到满意:)