如何获得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
也可以工作。 有关createType
和starProjectedType
更多信息, 请参阅此答案 。