Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin-在运行时确定嵌套泛型类型_Kotlin - Fatal编程技术网

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,有两种方法可以检索类型信息:

  • 使用像Guava的
    TypeToken
    这样的模式,并确保提供包含所需类型信息的匿名对象。这将使反射代码正常工作
  • 在编译过程中,使用具体化方法和
    typeOf()
    方法嵌入
    KType
  • findstatembeddype(状态:CS):FindState{
    val contentType=typeOf();
    //使用T执行您需要执行的操作,可能嵌入到包装器FindState类型中
    返回FindStateImpleWithType(状态,contentType)
    }
    
    关于为什么我们在JVM@szymon_prz上有这种形式的泛型,有一本很好的读物。很遗憾,该页面上没有评论部分…  即使你接受了近二十年前所做决定的所有理由(其中一些确实很有道理),也不一定证明从那以后所做的事情能够减轻一些痛苦(即:什么都没有)。@gidds是的,我们知道这个主题现在已经被抛在脑后,我们没有任何其他改进,但是我们在其他领域也得到了很多其他的改进,因为泛型的下一步改进并不是社区和公司所需要的,也不是JVM或Java的其他部分所需要的,我相信您也会对泛型之后所做的一些改进感到满意:)