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
相关产品推荐
相关产品推荐

