Kotlin 如果when用作表达式而不是语句,那么在when表达式中使用密封类的行为不同的原因是什么?
如果将密封类与Kotlin 如果when用作表达式而不是语句,那么在when表达式中使用密封类的行为不同的原因是什么?,kotlin,Kotlin,如果将密封类与一起使用时 例如,当我使用when作为语句时,这段代码是有效的: sealed class SomeType object Foo: SomeType() object Bar: SomeType() fun test(input: SomeType) { when(input) { is Foo -> {} } } 但当我将其用作表达式时,这并不是因为when期望else分支,或者代码检查SomeType的所有子类型,其中示例代码中缺少B
一起使用时
例如,当我使用when
作为语句时,这段代码是有效的:
sealed class SomeType
object Foo: SomeType()
object Bar: SomeType()
fun test(input: SomeType) {
when(input) {
is Foo -> {}
}
}
但当我将其用作表达式时,这并不是因为when
期望else
分支,或者代码检查SomeType
的所有子类型,其中示例代码中缺少Bar
:
sealed class SomeType
object Foo: SomeType()
object Bar: SomeType()
fun test(input: SomeType) {
var result = when(input) {
is Foo -> {}
}
}
这一设计决策背后的原因是什么
我的问题是,如果我不关心结果(不想使用
when
作为表达式),只想为每个when
分支执行返回Unit
的代码,但是我想让Kotlin在编译时抛出一个错误,如果我没有在when
语句中使用sealed类的所有子类型?我唯一的选择是使用一个伪变量,所以我强制when
语句成为一个表达式,即使我不关心结果如何?实现这种行为的任何其他方法(如果检查了所有情况,则进行编译时检查),可能在时不使用?Kotlin是一种强类型语言,它迫使您在声明值时显式地声明类型
:
强类型是一个用来指编程语言的概念
这对价值观与价值观的混合实施了严格的限制
不同的数据类型。当违反这些限制并出现错误时
(例外)发生
在第一种情况下,when
是一个语句,这实际上意味着如果任何条件适用,它将被执行,如果不适用,它将被忽略。那句话之后什么也没发生
在第二种情况下,when
是一个创建值的表达式——它只能在覆盖所有条件(包括else
)时自己检测类型
说:
如果将when用作表达式,则else分支是必需的,除非
编译器可以证明分支覆盖了所有可能的情况
条件
同样适用于If/else:
就像if一样,每个分支都可以是一个块,其值是
块中最后一个表达式的值
在我看来,似乎该特定函数可以是
SomeType
的一部分和/或由其子类型提供,例如,如果您向SomeType
添加一个抽象函数,您将被迫为其所有子类型实现它,并且无法克服这一点。。。这比希望所有的当和如果都具备所有可能的条件要好得多。。。否:我不知道是否有任何检查或工具来检查是否在/被用尽时使用:-)
val result1 = if(true) 1 //will not compile
val result2 = if(true) 1 else 2 // will compile