如果您将密封类与when
,Kotlin threats when
differently if you use it as expression than if you use it as a statement一起使用。
例如,当我使用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
作为表达式),而只想执行一些为每个{{ 1}}分支,但是如果我没有在Unit
语句中使用所有密封类的子类型,我想让Kotlin在编译时抛出错误吗?我唯一的选择是使用虚拟变量,因此即使我不在乎结果,我也强制when
语句为表达式。还有其他方法可以实现这种行为(如果检查了所有情况,则进行编译时检查),也许没有when
?
答案 0 :(得分:0)
Kotlin是一种强类型语言,它会在您声明值时强制您明确声明类型。
严格类型化是用于引用编程语言的概念 对价值与 不同的数据类型。当违反此类限制并出错时 (例外)发生。
在您的第一种情况下,when
是一个声明,实际上意味着如果有任何条件适用,则将其执行,否则将被执行-将其忽略。此后该声明什么也没有发生。
在第二种情况下,when
是创建值的表达式-仅当包括else
在内的所有条件都包括在内时,它才能自行检测类型。< / p>
如果将 when 用作表达式,则 else 分支是必需的,除非 编译器可以证明分支涵盖了所有可能的情况 条件
对于if / else同样适用:
就像 if 一样,每个分支可以是一个块,其值为 该块中最后一个表达式的值。
val result1 = if(true) 1 //will not compile
val result2 = if(true) 1 else 2 // will compile