对于最后一堂课,为什么抱怨?

时间:2019-07-26 12:07:27

标签: kotlin kotlin-when

因此,在以下代码中,我收到“当必须穷尽时添加必要的其他”的编译错误:

class Test {

}

fun eval(e: Test): Int =
        when(e) {
            is Test -> throw IllegalArgumentException()
        }

要澄清这一点,仅是旨在了解Kotlin(此处为新手)的代码。
因此,默认情况下,Test不能由Kotlin的任何子类扩展。
那么when还会遇到什么其他情况?
在这种情况下,使用sealed也不起作用

4 个答案:

答案 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
}