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

Kotlin密封类toString输出不符预期:DarkRed为何被识别为Dark?

为什么密封类实例的toString()会匹配到父类分支?

你遇到的问题核心是Kotlin的when表达式匹配顺序优先级——它是按照你编写的顺序从上到下依次检查条件的,一旦匹配成功就会立刻返回结果,不会继续执行后续分支。

看你代码里的toString()方法:

override fun toString(): String = when (this) {
    is Color.Dark -> "Dark"
    is Color.Dark.DarkRed -> "Dark Red"
    is Color.Dark.DarkBlue -> "Dark Blue"
}

Color.Dark.DarkRed本质上是Color.Dark的子类实例,所以当代码检查到第一个条件is Color.Dark时,这个条件就已经满足了,直接返回"Dark",完全不会走到后面针对具体子类的分支。

修复方案

只需要把更具体的子类分支放在父类分支的前面,让when先检查具体类型,再检查通用父类型:

override fun toString(): String = when (this) {
    is Color.Dark.DarkRed -> "Dark Red"
    is Color.Dark.DarkBlue -> "Dark Blue"
    is Color.Dark -> "Dark" // 这个分支只会匹配除DarkRed/DarkBlue之外的Dark子类(如果后续扩展的话)
}

这样修改后,当实例是DarkRed时,会优先匹配第一个分支,返回"Dark Red",完全符合你的预期。

补充说明:密封类的when表达式如果覆盖了所有可能的子类,其实可以不用写else分支,但这里把父类分支放在最后,相当于兜底处理所有未明确匹配的Dark子类,逻辑是通顺的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:32:30