【问题标题】:Android Studio not recognising that a when statement is exhaustive with a sealed classAndroid Studio 无法识别密封类的 when 语句是详尽无遗的
【发布时间】:2021-04-14 15:52:22
【问题描述】:

我有一个名为Outcome 的简单结果类,它是密封的,由三个子类组成:WaitingSuccessFailure

sealed class Outcome<out T> {

    object Waiting : Outcome<Nothing>()

    class Success<T>(val data: T) : Outcome<T>()

    open class Failure : Outcome<Nothing>()
}

现在我想使用when 语句来检查通用Outcome 是哪个类型,但是Android Studio(特别是Android Studio,IntelliJ IDEA 没有这个问题)似乎认为它并不详尽并给出警告:

密封类上的'when'表达式建议详尽,添加'is Failure'、'is Success'、'Waiting'分支或'else'分支

但是when 绝对详尽的:

when (o) {

    is Outcome.Failure -> TODO()
    is Outcome.Success -> TODO()
    Outcome.Waiting -> TODO()
}

即使我要求添加剩余的分支,它只是添加了我已经拥有的内容的副本,仍然会产生相同的错误:

when (o) {

    is Outcome.Failure -> TODO()
    is Outcome.Success -> TODO()
    Outcome.Waiting -> TODO()
    is Outcome.Failure -> TODO()
    is Outcome.Success -> TODO()
    Outcome.Waiting -> TODO()
}

这不是一个大问题,因为它只是一个警告,不会导致任何实际问题。不过我想知道这是推理错误还是与我的设计有关。


注意:我的 Android Studio 插件版本是 1.4.32-release-Studio4.1-1,我在一个全新的项目中尝试过这个,得到了相同的结果。

【问题讨论】:

  • 我无法重现警告。我会检查您项目中使用的 Kotlin 插件和 Kotlin 版本的版本。也许修复了一个错误,并且您的 IntelliJ IDE 具有更新的插件,或者该项目正在使用更高版本的 Kotlin。
  • 感谢您检查@Tenfour04,我实际上有1.4.32-release-Studio4.1-1 用于Android Studio 和1.3.72-release-IJ2020.1-5。你有相同的 Android Studio 插件吗?
  • 我使用了 Kotlin 1.4.21 版本来检查它。
  • 奇怪,我用 1.4.21 尝试了一个新项目,但仍然收到相同的警告。
  • 在使用 ArcticFox 2020.3.1 Patch 3 和 Kotlin 插件 203-1.5.31-release-550-AS7717.8 时遇到相同的错误。只有 lint.isWarningsAsErrors = true 才会让人讨厌。

标签: android android-studio kotlin compiler-warnings sealed-class


【解决方案1】:

自从升级到 Kotlin 1.5(特别是 202-1.5.0-release-764-AS8194.7)后,这个问题现在已经得到纠正,所以看起来它一定只是一个推理错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-18
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多