Kotlin中的密封类,不兼容的types错误
我有以下Kotlin代码。 一个叫做Animal
的密封类,以及两个对象类Dog
和Cat
从密封类Animal
inheritance。 我是在猫案中的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代码将编译和工作
你的代码有两个点,编译器整体上并不了解:
- 在你的
when
子句中,你检查你的typesDog
variables是否真的is Dog
。 - 在你的
when
子句中,你还要检查你的Dog
typesvariables是否是Cat
。
这与编译器有些矛盾,因为两种types只是相互共享一个超types。 问题的确是你的variables没有显式声明它的types 。 由于将Dog
实例分配给var i
,编译器推断它的types,这当然是Dog
。 之后的一切都是有道理的:不需要检查实例types,它只是一个Dog
。
为了使代码正常工作,您必须声明var i: Animal
,明确键入。 另外, 总是考虑使用val
来支持var
。