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



我有以下 Kotlin 代码。一个名为 Animal 的密封类和两个对象类 DogCat 继承自密封类 Animal 。我在 IS Cat 情况下的 when 子句中收到此错误。

Incompatible types: Cat and Dog

为什么会给出此错误?如何在 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()
        }
    }
}

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

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

您的代码有两个地方,编译器作为一个整体并不真正理解:

  1. when 子句中,检查类型为 Dog 的变量是否真的is Dog
  2. when 子句中,您还可以检查类型 Dog 的变量是否为 Cat

这与编译器有点矛盾,因为这两种类型彼此仅共享一个超类型。问题实际上是您的变量没有显式声明其类型。由于将Dog实例分配给您的var i,编译器推断其类型,这当然是Dog。之后的一切都有意义:无需检查实例类型,它肯定是一个Dog .

要使代码正常工作,您必须声明 var i: Animal ,显式类型化。另外,始终考虑使用val以支持var

最新更新