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'是Dark
和DarkRed
,并且is Dark
在is DarkRed
之前检查。
when
将输入解析为 true 的第一个子句。
要解决此问题,请将最具体的检查放在较不具体的检查之前。
你可以把行 is Color.Dark -> "Dark"
放在 toString 函数的末尾。在你的情况下 is Color.Dark
returns DarkRed 为真。
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'是Dark
和DarkRed
,并且is Dark
在is DarkRed
之前检查。
when
将输入解析为 true 的第一个子句。
要解决此问题,请将最具体的检查放在较不具体的检查之前。
你可以把行 is Color.Dark -> "Dark"
放在 toString 函数的末尾。在你的情况下 is Color.Dark
returns DarkRed 为真。