0

下面的代码在不可能通过条件 Color.Dark 和 Color.Light 时编译,因为这两个类是抽象的。

我错过了什么 ?

sealed class Color () {
  sealed class Dark () {
    class DarkRed : Color()
    class DarkBlue : Color()
    }   
  sealed class Light {
    class LightRed : Color()
    class LightBlue : Color()
    }
}   

fun eval(c: Color) =
        when (c) {
        is Color.Dark -> println("Dark")
            is Color.Dark.DarkRed -> println("Dark Red")
            is Color.Dark.DarkBlue -> println("Dark Blue")

        is Color.Light -> println("Light")
            is Color.Light.LightRed -> println("Light Red")
            is Color.Light.LightBlue -> println("Light Blue")
}

fun main(args: Array<String>) {
    val dr = Color.Dark.DarkRed()
    eval(dr)
}
4

1 回答 1

2

两个左缩进条件永远不会满足Color.Dark,因为它们Color.Light不继承Color,而不是因为它们是抽象的。这意味着 6 个is分支中有 2 个是无用的,您可以放心地删除它们。但其他 4 个分支(is Color.Dark.DarkRed等)贯穿所有Color子类,并且Color是密封类,因此when可以不使用else分支。

于 2020-01-19T18:40:32.963 回答