在我的Kotlin代码中,我有一个变量,它是来自 java.lang.reflect
var type: Type
但是我需要将其强制转换为:
List<UserInfo>
如果我不投射到列表,则只需执行以下操作:
var type = UserInfo::class.java
,这有效。但我不知道如何使用列表进行转换。我找到的最接近的是:
var type = Array<UserInfo>::class.java
如果我的UserInfo是一个数组但它是一个列表,它将编译。
答案 0 :(得分:0)
问题(如@ Miha_x64所说)是type erasure。
Java虚拟机对类型参数一无所知。因此,尽管源指定了List<UserInfo>
,但它会编译为纯List
。
这可行:
var type = List::class.java
(您的Array
示例之所以有用,是因为数组是一种特殊情况:JVM直接支持它们,并在运行时保留其类型。)
Java对类型擦除的使用至少部分是出于历史原因;当将泛型添加到Java 5中时,他们希望保留与现有源代码和字节码的兼容性。有关所有详细信息(其中很多是Kotlin继承的),请参见here。
答案 1 :(得分:0)
也许已经晚了。尝试将 KTypeProjection 和 createType() 与 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>