gpt4 book ai didi

kotlin - 从 kotlin 中的嵌套类型参数获取类

转载 作者:行者123 更新时间:2023-12-02 13:09:20 25 4
gpt4 key购买 nike

我有一个这样的 val

val qs = hashMapOf<KProperty1<ProfileModel.PersonalInfo, *> ,Question>()

如何从此变量中获取 ProfileModel.PersonalInfo 的类?

换句话说,什么表达式(当然涉及 qs)应该替换 Any 以便该测试通过。
@Test
fun obtaionResultTypeFromQuestionList(){
val resultType = Any()
assertEquals(ProfileModel.PersonalInfo::class, resultType)
}

感谢您的关注

最佳答案

由于Java type erasure,没有直接的方法可以获取此类信息。 .
简而言之-关于泛型的所有信息(在您的情况下)在运行时不可用,HashMap<String, String>变成 HashMap .

但是,如果您在 JVM 级别上进行一些更改,例如定义新类,则会保留有关实际类型参数的信息。它使您能够执行以下操作:

val toResolve = object : HashMap<KProperty1<ProfileModel.PersonalInfo, *> ,Question>() {
init {
//fill your data here
}
}

val parameterized = toResolve::class.java.genericSuperclass as ParameterizedType
val property = parameterized.actualTypeArguments[0] as ParameterizedType
print(property.actualTypeArguments[0])

打印 ProfileModel.PersonalInfo .

解释:
  • 我们定义了新的匿名类 这会影响 JVM 级别,而不仅仅是运行时,因此留下有关泛型的信息
  • 我们得到了新匿名类实例的通用父类(super class),结果是 HashMap< ... , ... >
  • 我们得到第一个类型,它被传递给 HashMap通用括号。它给了我们KProperty1< ... , ... >
  • 使用 KProperty1 执行上一步

  • Kotlin 与 Java 一样与 JVM 类型删除相关。您可以通过将哈希映射的创建移动到单独的函数来做一个更好的代码:
    inline fun <reified K, reified V> genericHashMapOf(
    vararg pairs: Pair<K, V>
    ): HashMap<K, V> = object : HashMap<K, V>() {
    init {
    putAll(pairs)
    }
    }

    ...

    val hashMap = genericHashMapOf(something to something)

    关于kotlin - 从 kotlin 中的嵌套类型参数获取类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50539849/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com