1

我有一个这样的 val

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

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

换句话说,什么表达式(当然涉及 qs)应该替换Any以便该测试通过。

@Test
fun obtaionResultTypeFromQuestionList(){
    val resultType = Any()
    assertEquals(ProfileModel.PersonalInfo::class, resultType)
}

感谢您的关注

4

1 回答 1

4

由于Java 类型擦除,没有直接的方法可以获取此类信息。简而言之-有关泛型(在您的情况下)的所有信息在运行时都不可用,并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

解释:

  1. 我们定义了影响 JVM 级别的新匿名类,而不仅仅是运行时,因此留下了有关泛型的信息
  2. 我们得到了新的匿名类实例的通用超类,结果是什么HashMap< ... , ... >
  3. 我们得到第一个类型,它被传递给HashMap通用括号。它给了我们KProperty1< ... , ... >
  4. 做上一步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)
于 2018-05-26T06:48:55.540 回答