小编Dav*_*idT的帖子

Kotlin - 如何避免在密封类的 when() 语句中转换第二个变量

我有一个代表字段类型的密封类:

sealed class FieldDef {
    object StringField: FieldDef()
    class ListField(val element: FieldDef): FieldDef()
    class MapField(val children: Map<String, FieldDef>): FieldDef()

    // ... more field types
}
Run Code Online (Sandbox Code Playgroud)

我有一个处理一对字段定义的函数。

    fun processSameTypes(fd1: FieldDef, fd2: FieldDef) {
        if (fd1::class == fd2::class) {
            when (fd1) {
                is MapField -> processMaps(fd1, (fd2 as MapField))
                is ListField -> processLists(fd1, (fd2 as ListField))
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

编写的代码是正确的 - 鉴于逻辑, fd2 变量的转换将始终成功。

但我觉得应该有一种方法可以在不使用强制转换的情况下表达这一点,但是如果我尝试删除强制转换,则会收到错误:

Kotlin: Type mismatch: inferred type is FieldDef but FieldDef.ListField was expected
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来处理这个问题,以便我可以移除演员(演员不是必需的)。

如果没有更好的方法来解决这个问题,您能否解释一下为什么编译器无法推断变量的正确类型fd2。我的逻辑是,由于when受外部保护 …

kotlin

3
推荐指数
1
解决办法
163
查看次数

标签 统计

kotlin ×1