Kotlin如何优雅实现兼容Boolean与Float的类型以适配kotlinx序列化
最优方案是用Kotlin的密封类(Sealed Class) 来定义Bar,完美适配「仅允许两种固定类型取值」的业务场景,完全规避你当前实现里的可变属性、空判断冗余、类型不安全的问题。
实现代码
sealed class Bar { data class BooleanValue(val value: Boolean) : Bar() data class FloatValue(val value: Float) : Bar() }
序列化器适配
你现有的BarSerializer里判断JSON值类型的逻辑无需修改,只需要把原来实例化Bar的逻辑替换为对应子类即可:
- 读取到布尔类型时,构造
Bar.BooleanValue(你的布尔值) - 读取到浮点类型时,构造
Bar.FloatValue(你的浮点值)
使用方式
不需要再判断两个属性哪个非空,直接用Kotlin的when表达式做类型匹配,编译器会自动检查是否覆盖所有分支,不会出现漏处理的情况:
fun processBar(bar: Bar) { when (bar) { is Bar.BooleanValue -> { // 直接取bar.value就是Boolean类型,无需额外转型或判空 println("得到布尔值:${bar.value}") } is Bar.FloatValue -> { // 直接取bar.value就是Float类型 println("得到浮点值:${bar.value}") } } }
额外优势
- 完全不可变,没有属性被意外修改的风险
- 不存在非法状态:不可能出现两个值都为空、或者都不为空的异常情况
- 全链路类型安全,不需要做额外的类型转换或者空校验,编译器全程兜底
如果有特殊场景需要统一取出原始值,还可以给Bar基类加通用的value属性,无需修改上层调用逻辑:
sealed class Bar { abstract val value: Any data class BooleanValue(override val value: Boolean) : Bar() data class FloatValue(override val value: Float) : Bar() }
内容的提问来源于stack exchange,提问作者cris
相关产品推荐
相关产品推荐

