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

