Kotlin 伴随对象意外结果

Kotlin companion object unexpected result

sealed class Color () {
    sealed class Dark (): Color() {
    object DarkRed : Dark()
    object DarkBlue : Dark()
    }   
    override fun toString(): String = when (this) {
        is Color.Dark -> "Dark"
        is Color.Dark.DarkRed -> "Dark Red"
        is Color.Dark.DarkBlue -> "Dark Blue"
    }
    companion object Companion {
    fun make(name: String): Color = when (name) {
        "DarkRed" -> Color.Dark.DarkRed 
        "DarkBlue" -> Color.Dark.DarkBlue
        else -> throw Exception ("Error unkown color '$name'") 
    }
    }
}
fun main(args: Array<String>) {
    val color = Color.Companion.make("DarkRed")
    println (color.toString()) // Dark is printed not "Dark Red"
}

上面的代码打印 Dark 而我期望 Dark Red。似乎 make 返回类型 Color.Dark.DarkRed 被解释为 Color.Dark通过 ofString() 函数,为什么?

因为'DarkRed'是DarkDarkRed,并且is Darkis DarkRed之前检查。

when 将输入解析为 true 的第一个子句。

要解决此问题,请将最具体的检查放在较不具体的检查之前。

你可以把行 is Color.Dark -> "Dark" 放在 toString 函数的末尾。在你的情况下 is Color.Dark returns DarkRed 为真。