如何使用内联函数检查泛型是否为Array类型?
检查内联函数中泛型是否为Array类型的解决方案
你提到的问题确实是因为具体的Array类型(比如Array<Int>、Array<String>)和Array::class并不相等——Array::class代表的是无界通配符的Array<*>类型,而带具体元素类型的数组对应的KClass是各自独立的,所以直接用==判断会失败。
以下是两种可行的解决方式:
方法一:利用Java反射判断数组类型
通过C::class.java.isArray可以直接判断当前泛型类型是否为任意元素类型的数组:
class Mediator { inline fun <reified C> mediate(string: String): Container<C> { return when { C::class == Int::class -> { // 处理Int类型逻辑 Container(0 as C) } C::class.java.isArray -> { // 获取数组的元素类型(可选) val elementKClass = C::class.java.componentType.kotlin println("数组元素类型:$elementKClass") // 处理数组类型逻辑 Container(arrayOf<Any?>() as C) } else -> throw IllegalStateException("Yopta") } } } data class Container<T>(val value: T)
方法二:通过KClass的继承关系判断
利用isSubclassOf方法判断当前泛型的KClass是否是Array::class的子类:
class Mediator { inline fun <reified C> mediate(string: String): Container<C> { return when { C::class == Int::class -> { Container(0 as C) } C::class.isSubclassOf(Array::class) -> { // 处理数组类型逻辑 Container(arrayOf<Any?>() as C) } else -> throw IllegalStateException("Yopta") } } } data class Container<T>(val value: T)
补充说明
- 如果需要针对特定元素类型的数组做处理(比如只处理
Array<Int>),可以直接判断C::class == Array<Int>::class。 - 借助
C::class.java.componentType可以拿到数组元素的Java Class,再通过.kotlin转成Kotlin的KClass,方便后续对元素类型的判断或操作。
内容的提问来源于stack exchange,提问作者ᴜsᴇʀ
相关产品推荐
相关产品推荐

