将反射“类型”强制转换为Kotlin中的List <class>

时间:2019-05-28 13:31:57

标签: kotlin

在我的Kotlin代码中,我有一个变量,它是来自 java.lang.reflect

var type: Type

但是我需要将其强制转换为:

List<UserInfo>

如果我不投射到列表,则只需执行以下操作:

var type = UserInfo::class.java

,这有效。但我不知道如何使用列表进行转换。我找到的最接近的是:

var type = Array<UserInfo>::class.java

如果我的UserInfo是一个数组但它是一个列表,它将编译。

2 个答案:

答案 0 :(得分:0)

问题(如@ Miha_x64所说)是type erasure

Java虚拟机对类型参数一无所知。因此,尽管源指定了List<UserInfo>,但它会编译为纯List

这可行:

var type = List::class.java

(您的Array示例之所以有用,是因为数组是一种特殊情况:JVM直接支持它们,并在运行时保留其类型。)

Java对类型擦除的使用至少部分是出于历史原因;当将泛型添加到Java 5中时,他们希望保留与现有源代码和字节码的兼容性。有关所有详细信息(其中很多是Kotlin继承的),请参见here

答案 1 :(得分:0)

也许已经晚了。尝试将 KTypeProjectioncreateType() 与 KClass 一起使用。然后获取 KType 中的值或将其转换回 java Type。

val kClass = YourClass::class
val kTypeProjection = KTypeProjection.invariant(entity.starProjectedType)
val kType = List::class.createType(listOf(kTypeProjection))
val type = kType.javaType

结果:

kType: kotlin.collections.List<YourClass>
type: java.util.List<YourClass>