You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用内联函数检查泛型是否为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ᴇʀ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:35:11