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

Kotlin如何在泛型基类中获取类型参数的类名?

解决方案

你之前直接调用T::class.java.simpleName失败的核心原因是Kotlin泛型存在类型擦除,运行时基类无法直接获取泛型实参T的具体类型信息。最优实现方案是给基类增加构造参数传入KClass<T>,在基层统一复用这个类型信息实现两个通用成员:

调整后的基类实现

import kotlin.reflect.KClass
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialDescriptor
import kotlinx.serialization.SerializationException
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.json.JsonObject

abstract class JSONDeserializationStrategy<T : Any>(
    private val tClass: KClass<T>
) : DeserializationStrategy<T> {
    // 基类统一实现descriptor,?: 操作符适配特殊类无simpleName的边界场景
    override val descriptor: SerialDescriptor = buildClassSerialDescriptor(tClass.simpleName ?: "UnknownClass")

    // 基类统一实现异常生成方法
    protected open fun getSerializationException(): SerializationException =
        SerializationException("Invalid JSON received for ${tClass.simpleName ?: "UnknownClass"}.")
    // 如果你原有业务逻辑需要调用该方法时直接抛出异常,只需把上面的return改为throw即可,完全兼容原有逻辑

    protected abstract fun parse(json: JsonObject): T
}

派生类简化实现

派生类仅需要在继承基类时传入对应泛型实参的KClass即可,无需再重复实现descriptor和异常方法:

class MyClassParserDeserializationStrategy : JSONDeserializationStrategy<MyClass>(MyClass::class) {
    override fun parse(json: JsonObject): MyClass {
        // 你的解析逻辑实现
    }
}

可选简化方案

如果想进一步省略派生类的样板代码,可以新增一个inline reified的顶层辅助构造函数,无需手动声明派生类即可创建实例:

inline fun <reified T : Any> JSONDeserializationStrategy(
    crossinline parseImpl: (JsonObject) -> T
): JSONDeserializationStrategy<T> = object : JSONDeserializationStrategy<T>(T::class) {
    override fun parse(json: JsonObject): T = parseImpl(json)
}

使用示例:

val myClassDeserializationStrategy = JSONDeserializationStrategy<MyClass> { json ->
    // 直接编写解析逻辑即可
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:36:03