因此,在以下代码中,我收到“当必须穷尽时添加必要的其他”的编译错误:
class Test {
}
fun eval(e: Test): Int =
when(e) {
is Test -> throw IllegalArgumentException()
}
要澄清这一点,仅是旨在了解Kotlin(此处为新手)的代码。
因此,默认情况下,Test
不能由Kotlin的任何子类扩展。
那么when
还会遇到什么其他情况?
在这种情况下,使用sealed
也不起作用
答案 0 :(得分:1)
在没有其他更改的情况下添加sealed
是没有意义的:它使类成为抽象类并且无法进行子类化,因此您永远不会有实例。我相信这是一个编译器错误,尽管使用class
而不是object
,但它与https://youtrack.jetbrains.com/issue/KT-28249非常相似。
这也是影响力较小的一个,因为如果is Test
是唯一的分支,则可以将整个when
替换为该分支,如果不是,则可以替换{{ 1}}和is Test
。
答案 1 :(得分:0)
班级考试
因为当需要返回默认值时,如果元素(e)不匹配,则应该返回默认值
copy(dataLayer)
另一种选择是更改返回类型在您的函数中为空
class Test
fun eval(e: Test): Int =
when (e) {
is Test -> throw IllegalArgumentException()
else -> 7 //default value
}
何时
如果将when用作表达式,则else分支是必需的,除非编译器可以证明所有 可能的情况包含分支条件
。
有关更多详细信息,请参见when-expression
如果元素是单个的,则没有使用时点。您的功能可以简化如下
fun eval(e: Test): Int? =
when (e) {
is Test -> throw IllegalArgumentException()
else -> null
}
答案 2 :(得分:0)
问题是,当您想在return / assign语句中使用x86_64-posix-seh
时,必须将其详尽无遗。
例如:
when
这可以。您不会期待任何结果。如果// let k be of Any? type:
when (k) {
is Number -> { println("Ok, k is a Number") }
}
是一个数字,则将打印一些内容。否则,什么都不会发生。
第二个例子:
k
但是,如果布尔值不是数字怎么办?代码将无法编译,因为您的程序将处于不确定状态。
那么,您能做什么?您的// k is the same
boolean isNumber = when (k) {
is Number -> true;
}
必须详尽无遗。因此,只需添加when
。一种模式是,例如,如果遇到类似情况,则抛出else
。
IllegalStateException()
答案 3 :(得分:0)
那么,什么时候还会发生其他情况?-“其他”,因为Test不是密封类。
该错误清楚地表明您需要添加else条件,由于该函数返回Integer并且错误消失了,因此我试图在else条件中返回0。
class Test {
}
fun eval(e: Test): Int =
when(e) {
is Test -> throw IllegalArgumentException()
else -> 0
}
或者您需要分配给var或val并返回如下的Int值,
fun eval(e: Test): Int {
val i: Int = when (e) {
is Test -> throw IllegalArgumentException()
else -> 0
}
return i
}