如何获得Kotlin的KType?

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

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

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

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

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

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

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

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

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

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