Kotlin - 从 KType 获取 KClass<*>

15
在 Kotlin 中,我可以通过以下方式从 KClass<*> 获取 KType
Int::class.createType()
如何反向获取表示kotlin.Int的KType,以获得KClass<Int>?

5
我认为这是正确的链接:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect.jvm/jvm-erasure.html。 - marstran
1
这里有一些关于该主题的解释 https://discuss.kotlinlang.org/t/why-is-kclass-not-a-ktype/3341/2 - sedovav
1个回答

14
您可以使用KType.classifier进行此操作。
val intType : KType = Int::class.createType()
val intClassifier : KClassifier? = intType.classifier
assertEquals(Int::class, intClassifier) // true

注意,自1.3.40版本以来,您还可以(至少在JVM上)使用实验性的typeOf<Int>()来获取您的KType。您可能需要查看1.3.40公告,以确定它是否对您有用。

谈到JVM:在JVM上,您还可以使用KType.jvmErasure来获取实际类,正如marstran在评论中指出的那样。


1
谢谢Roland。我看到了typeOf<Int>()的公告...太酷了!基本上是Kotlin中类似于C#中typeof的等效物。 - Matthew Layton
如果我要准确的说,应该是 typeOf<T>()。实现大概就像这样:inline fun <reified T> typeOf() = T::class.createType() - Matthew Layton
5
@series0ne,不,实现方式更加复杂。使用SomeType::class.createType()会丢失关于SomeType的类型参数和可空性的信息。相比之下,typeOf<SomeType>()保留了该信息,因为它使用了编译器内部函数,并将类型信息硬编码到字节码中。例如,看一下编译器为typeOf<MutableList<Int?>?>()生成的字节码。 - hotkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接