Kotlin中的密封类,类型不兼容错误

s-h*_*ter 3 kotlin sealed-class

我有以下Kotlin代码。一个密封的类称为Animal,还有两个对象类,DogCat从该密封的类继承Animal。我when在is Cat案例的子句中收到此错误。

Incompatible types: Cat and Dog
Run Code Online (Sandbox Code Playgroud)

为什么会出现此错误?如何在Kotlin中使用密封类进行此类操作?密封类是进行多态性的好选择吗?

sealed class Animal {
  abstract fun speak()
}

object Dog : Animal() {
    override fun speak() { println("woof") }
}

object Cat : Animal() {
    override fun speak() { println("meow") }
}

fun main(args: Array<String>) {
    var i = Dog
    i.speak()
    when(i) {
        is Dog -> {
            print("Dog: ")
            i.speak()
        }
        is Cat -> {
            print("Cat: ")
            i.speak()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ruX*_*ruX 5

缺少的部分是 var i: Animal = Dog

基本上,编译器抱怨类型- Cat不是的子类型Dog(但它们都是的子类型Animal,这就是为什么如果您明确设置基本类型代码将可以编译并工作的原因