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
相关产品推荐
相关产品推荐

