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

如何在Kotlin中泛型实现KType对应字符串值的类型转换

基于KType键的字符串值泛型转换实现

可行,借助Kotlin反射API可以实现这种泛型转换逻辑,无需为每种类型单独编写分支判断。以下是具体实现方案:

核心思路

利用Kotlin反射的KType、KClass能力,动态识别目标类型并执行对应转换:

  • 针对常见基本类型(Boolean、Int、Long等)直接调用String的内置转换方法
  • 处理可空类型,支持空字符串转null
  • 兼容自定义类型,只要类型存在接收String参数的构造函数

代码实现

首先确保项目引入kotlin-reflect依赖(Gradle示例:implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version")

import kotlin.reflect.KType
import kotlin.reflect.full.createType
import kotlin.reflect.full.isSubtypeOf
import kotlin.reflect.full.starProjectedType

fun String.convertTo(kType: KType): Any? {
    return when {
        // 基础类型转换逻辑
        kType == Boolean::class.starProjectedType -> this.toBoolean()
        kType == Int::class.starProjectedType -> this.toInt()
        kType == Long::class.starProjectedType -> this.toLong()
        kType == Float::class.starProjectedType -> this.toFloat()
        kType == Double::class.starProjectedType -> this.toDouble()
        kType == String::class.starProjectedType -> this
        // 可空类型处理
        kType.isMarkedNullable -> {
            val nonNullType = kType.makeNullable(false)
            if (this.isBlank()) null else this.convertTo(nonNullType)
        }
        // 自定义类型:尝试调用单参数String构造函数
        kType.classifier is kotlin.reflect.KClass<*> -> {
            val kClass = kType.classifier as kotlin.reflect.KClass<*>
            val constructor = kClass.constructors.firstOrNull {
                it.parameters.size == 1 && it.parameters[0].type.isSubtypeOf(String::class.starProjectedType)
            }
            constructor?.call(this) ?: error("不支持的类型转换:$kType")
        }
        else -> error("不支持的类型转换:$kType")
    }
}

// 测试示例
fun main() {
    val map = mapOf(
        Boolean::class.starProjectedType to "true",
        Int::class.starProjectedType to "123",
        String::class.starProjectedType to "hello",
        Long::class.starProjectedType to "456789",
        Double::class.starProjectedType to "3.14",
        Int::class.createType(nullable = true) to ""
    )

    val convertedMap = map.mapValues { (type, value) -> value.convertTo(type) }
    convertedMap.forEach { (k, v) ->
        println("类型:$k,转换后值:$v(类型:${v?.let { it::class.simpleName } ?: "null"})")
    }
}

说明

  • 该实现无需为每种类型单独写判断逻辑,新增支持类型时只需扩展基础类型分支,或确保自定义类型有String参数构造函数即可
  • 依赖反射API,性能上略逊于硬编码分支,但对于大多数业务场景完全够用
  • 题目中已明确所有值均可转换,因此无需额外处理转换失败的异常(若需要可添加try-catch块捕获转换异常)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:32:23