我有一个密封的类层次结构,如下所示:
sealed class Base
class A : Base()
abstract class B : Base()
class C : Base()
class D : Base()
然后我想要一个详尽的when
:
fun main() {
val c: Base = C()
when (c) {
is A -> println("A")
is C -> println("C")
is D -> println("D")
}.let {}
}
但这是不允许的,因为
'when' expression must be exhaustive, add necessary 'is B' branch or 'else' branch instead
但这不是真的!我已经涵盖了所有可能性。没有任何价值与我的时间不匹配。
此外,如果我添加一个is C
子句:
when (c) {
is A -> println("A")
is B -> println("B")
is C -> println("C")
is D -> println("D")
}.let {}
它实际上没有被称为. C
被打印。
这实际上也是另一个方向的问题。假设我想要相同的逻辑来处理B
:C
和D
:的所有子类
when (c) {
is A -> println("A")
is B -> println("some subclass of B")
}.let {}
这也是不允许的,即使它是详尽的。这里发生了什么?这是 Kotlin 中的错误吗?我错过了什么吗?