如果将when用作表达式而不是语句,则在表达式行为不同时使用密封类的原因是什么?

如果您将密封类与whenKotlin 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

you6251545 回答:如果将when用作表达式而不是语句,则在表达式行为不同时使用密封类的原因是什么?

Kotlin是一种强类型语言,它会在您声明值时强制您明确声明类型。

Techopedia

  

严格类型化是用于引用编程语言的概念   对价值与   不同的数据类型。当违反此类限制并出错时   (例外)发生。

在您的第一种情况下,when是一个声明,实际上意味着如果有任何条件适用,则将其执行,否则将被执行-将其忽略。此后该声明什么也没有发生。

在第二种情况下,when是创建值的表达式-仅当包括else在内的所有条件都包括在内时,它才能自行检测类型。

Kotlin documentation说:

  

如果将 when 用作表达式,则 else 分支是必需的,除非   编译器可以证明分支涵盖了所有可能的情况   条件

对于if / else同样适用:

  

就像 if 一样,每个分支可以是一个块,其值为   该块中最后一个表达式的值。

val result1 = if(true) 1 //will not compile
val result2 = if(true) 1 else 2 // will compile
本文链接:https://www.f2er.com/3159934.html

大家都在问