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

Kotlin如何实现泛型checkType函数根据入参返回对应类型判断结果

Kotlin checkType 类型检查函数实现

直接基于Kotlin的类型检测语法实现逻辑即可,先修正初始代码缺失的泛型声明,针对要求支持的6种类型做分支匹配,注意处理Map<String, String>的泛型擦除问题即可。

实现代码

// 用inline + reified 实化泛型参数,解决运行时泛型擦除导致的Map类型识别问题
inline fun <reified T> checkType(args: T): String {
    return when {
        args is Int -> "Yes! it's Integer"
        args is String -> "Yes! it's Strings"
        args is Boolean -> "Yes! it's Boolean"
        args is Double -> "Yes! it's Double"
        args is List<*> -> "Yes! it's List"
        args is Map<*, *> -> {
            // 遍历校验所有键值都是String类型,才判定为Map<String, String>
            val matchRequiredType = args.all { (key, value) -> key is String && value is String }
            if (matchRequiredType) "Yes! it's Map<String, String>" else "Unknown type"
        }
        else -> "Unknown type"
    }
}

fun main() {
    println(
        """
        '[10, 9, 8 , 6]' is List? ${checkType(listOf(10, 9, 8, 6))}
        'Kotlin' is String? ${checkType("Kotlin")}
        'True' is Boolean? ${checkType(true)}
        '10.01' is Double? ${checkType(10.01)}
        """.trimIndent()
    )
}

运行结果

执行main函数后输出如下,完全匹配预期:

'[10, 9, 8 , 6]' is List? Yes! it's List
'Kotlin' is String? Yes! it's Strings
'True' is Boolean? Yes! it's Boolean
'10.01' is Double? Yes! it's Double

单独调用checkType(10)时,会返回示例要求的Yes! it's Integer;传入键值均为String的Map时,也会正确返回Yes! it's Map<String, String>。

实现说明

  • 加reified关键字的原因是JVM存在泛型擦除机制,普通泛型函数在运行时无法获取Map的泛型参数类型,用实化类型参数配合内联函数,就能在运行时拿到实际类型信息
  • 针对Map类型额外加了元素遍历校验,避免把Map<Int, String>这类键值类型不符合要求的Map误判为目标类型
  • 几个待识别的基础类型不存在继承交叉问题,分支判断顺序不会导致误匹配

内容的提问来源于stack exchange,提问作者Cansee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:45:32