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

我有以下Kotlin代码。 一个叫做Animal的密封类,以及两个对象类DogCat从密封类Animalinheritance。 我是在猫案中的when子句中得到这个错误。

 Incompatible types: Cat and Dog 

为什么会出现这个错误? 如何在Kotlin中使用密封类来进行这种types的操作? 密封类是做多态的一个好的选择?

 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) { var i = Dog i.speak() when(i) { is Dog -> { print("Dog: ") i.speak() } is Cat -> { print("Cat: ") i.speak() } } } 

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

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

你的代码有两个点,编译器整体上并不了解:

  1. 在你的when子句中,你检查你的typesDogvariables是否真的is Dog
  2. 在你的when子句中,你还要检查你的Dogtypesvariables是否是Cat

这与编译器有些矛盾,因为两种types只是相互共享一个超types。 问题的确是你的variables没有显式声明它的types 。 由于将Dog实例分配给var i ,编译器推断它的types,这当然是Dog 。 之后的一切都是有道理的:不需要检查实例types,它只是一个Dog

为了使代码正常工作,您必须声明var i: Animal ,明确键入。 另外, 总是考虑使用val来支持var

Interesting Posts