Sealed class in Kotlin, Incompatible types 错误
Sealed class in Kotlin, Incompatible types error
我有以下 Kotlin 代码。一个密封的class叫Animal
,两个对象class是Dog
和Cat
继承自密封的classAnimal
。我在 is Cat 案例的 when
子句中收到此错误。
Incompatible types: Cat and Dog
为什么会出现这个错误?我如何在 Kotlin 中使用 sealed class 来进行这种类型的操作? sealed class 是做多态的好选择吗?
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
的子类型,这就是为什么如果您显式设置基类型代码将编译并工作
您的代码有两个地方编译器作为一个整体并没有真正理解:
- 在您的
when
子句中,您检查 Dog
类型的变量是否真的 is Dog
.
- 在您的
when
子句中,您 还 检查类型 Dog
的变量是否是 Cat
.
这与编译器有点矛盾,因为两种类型彼此只共享一个超类型。问题实际上是您的变量没有明确声明其类型。作为将 Dog
实例分配给您的 var i
的结果,编译器推断其类型,当然是 Dog
。之后的一切都有意义:无需检查实例类型,它肯定是 Dog
.
要使代码正常工作,您必须明确声明 var i: Animal
。另外,.
我有以下 Kotlin 代码。一个密封的class叫Animal
,两个对象class是Dog
和Cat
继承自密封的classAnimal
。我在 is Cat 案例的 when
子句中收到此错误。
Incompatible types: Cat and Dog
为什么会出现这个错误?我如何在 Kotlin 中使用 sealed class 来进行这种类型的操作? sealed class 是做多态的好选择吗?
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
的子类型,这就是为什么如果您显式设置基类型代码将编译并工作
您的代码有两个地方编译器作为一个整体并没有真正理解:
- 在您的
when
子句中,您检查Dog
类型的变量是否真的is Dog
. - 在您的
when
子句中,您 还 检查类型Dog
的变量是否是Cat
.
这与编译器有点矛盾,因为两种类型彼此只共享一个超类型。问题实际上是您的变量没有明确声明其类型。作为将 Dog
实例分配给您的 var i
的结果,编译器推断其类型,当然是 Dog
。之后的一切都有意义:无需检查实例类型,它肯定是 Dog
.
要使代码正常工作,您必须明确声明 var i: Animal
。另外,