You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin:如何避免密封类when语句中第二个变量的强转

Kotlin密封类类型推断优化:如何避免强制类型转换?

我定义了一个表示字段类型的密封类:

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

    // ... 更多字段类型
}

同时我有一个处理同类型字段定义的函数:

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))
        }
    }
}

这段代码逻辑是正确的,fd2的强制类型转换必然成功,但我觉得应该有不需要强转的写法。移除强转后会报错:

Kotlin: Type mismatch: inferred type is FieldDef but FieldDef.ListField was expected

请问有没有更好的方式实现无需强转的逻辑?如果没有,能否解释为什么编译器无法推断fd2的正确类型?我的思路是,外层的if已经确保fd1和fd2的类相同,而且FieldDef是密封类,编译器应该能推断出fd2的类型。

Kotlin版本:1.5.30(JVM)


编辑:结论
传递类对象是Java(以及继承其特性的Kotlin)中表示运行时类型的惯用写法,我希望未来Kotlin编译器能支持该场景的类型推断。

不过目前编译器还不支持这种推断,因此我认同@TreffnonX的观点,保留强转是当前的最佳方案,不会修改现有代码。但我确实询问了无需强转的解决方案,@Sweeper提供了可行方案,所以我将采纳该答案。

内容的提问来源于stack exchange,提问作者DavidT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:47:49