如何获得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,即不能区分List
和List
。
为了回答你最初的问题,你可以使用createType()
从KClass
创建一个createType()
:
val type: KType = Any::class.createType()
请注意,如果类是通用的,则需要传递generics参数的types投影。 在简单情况下(所有types的variables都可以用星形投影代替), starProjectedType
也可以工作。 有关createType
和starProjectedType
更多信息, 请参阅此答案 。