Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如果when用作表达式而不是语句,那么在when表达式中使用密封类的行为不同的原因是什么?_Kotlin - Fatal编程技术网

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