如何获得Kotlin的KType?

我正在尝试Kotlin中的reflectionfunction,但似乎无法理解如何获取KType值。

假设我有一个将短语映射到对象工厂的类。 在不明确的情况下,用户可以提供一个type参数,将搜索范围缩小到仅返回该types对象(或某个子types)的工厂。

 fun mapToFactory(phrase: Phrase, type: KType = Any::class): Any {...} 

type需要接受几乎任何东西,包括Int ,这从我的经验似乎有点特别对待。 默认情况下,它应该是Any东西,这意味着“不排除任何工厂”。

如何分配默认值(或任何值)来type

从你的描述,听起来像你的函数应该采取一个KClass参数,而不是一个KType ,并检查传入的对象与isSubclass ,而不是isSubtype

types(由kotlin-reflect中的kotlin-reflect表示)通常来自代码中声明的签名; 它们表示一系列函数作为参数或返回的值。 types由类,类的generics参数和可空性组成。 JVM上的运行时types的问题是由于擦除,不可能确定generics类variables的确切types。 例如,如果您有一个列表,则不能在运行时确定该列表的通用types,即不能区分ListList

为了回答你最初的问题,你可以使用createType()KClass创建一个createType()

 val type: KType = Any::class.createType() 

请注意,如果类是通用的,则需要传递generics参数的types投影。 在简单情况下(所有types的variables都可以用星形投影代替), starProjectedType也可以工作。 有关createTypestarProjectedType更多信息, 请参阅此答案 。