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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 22:24:08