从 kotlin 中的嵌套类型参数获取 class
obtain class from nested type parameters in kotlin
我有一个像这样构建的 val
val qs = hashMapOf<KProperty1<ProfileModel.PersonalInfo, *> ,Question>()
如何从这个变量中获取ProfileModel.PersonalInfo的class?
换句话说,什么表达式(当然涉及qs)应该替换Any,这样这个测试才能通过。
@Test
fun obtaionResultTypeFromQuestionList(){
val resultType = Any()
assertEquals(ProfileModel.PersonalInfo::class, resultType)
}
感谢您的关注
由于 Java type erasure,无法直接获取此类信息。
简而言之 - 所有关于泛型的信息(在你的情况下)在运行时都不可用并且 HashMap<String, String>
变成 HashMap
.
但是,如果您在 JVM 级别进行一些更改,例如定义新的 class,则会保留有关实际类型参数的信息。它使您能够像这样进行一些黑客攻击:
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
.
解释:
- 我们定义了新的匿名 class 这会影响 JVM 级别,而不仅仅是运行时,因此会留下有关泛型的信息
- 我们得到新的匿名 class 实例的通用晚餐 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)
我有一个像这样构建的 val
val qs = hashMapOf<KProperty1<ProfileModel.PersonalInfo, *> ,Question>()
如何从这个变量中获取ProfileModel.PersonalInfo的class?
换句话说,什么表达式(当然涉及qs)应该替换Any,这样这个测试才能通过。
@Test
fun obtaionResultTypeFromQuestionList(){
val resultType = Any()
assertEquals(ProfileModel.PersonalInfo::class, resultType)
}
感谢您的关注
由于 Java type erasure,无法直接获取此类信息。
简而言之 - 所有关于泛型的信息(在你的情况下)在运行时都不可用并且 HashMap<String, String>
变成 HashMap
.
但是,如果您在 JVM 级别进行一些更改,例如定义新的 class,则会保留有关实际类型参数的信息。它使您能够像这样进行一些黑客攻击:
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
.
解释:
- 我们定义了新的匿名 class 这会影响 JVM 级别,而不仅仅是运行时,因此会留下有关泛型的信息
- 我们得到新的匿名 class 实例的通用晚餐 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)