我正在尝试从任何 Any 变量智能转换选项,以便我可以确定选项是否为空,但是 IDE 指示 Option<*> 不能智能转换,因为它是在不同的模块中声明的。
fun hasEmptyValue(column: Pair<String, Any>): Boolean = when {
column.second is Option<*> -> column.second.isEmpty()
else -> false
}
以下原因使 smartcast 为我工作:
fun hasEmptyValue(column: Pair<String, Any>): Boolean {
val second = column.second
return when (second) {
is Option<*> -> second.isEmpty() //Smart cast to arrow.core.Option<*>
else -> false
}
}
Jetbrains 问题跟踪器上解释了为什么不允许跨模块进行智能转换:
仅当保证对同一属性的多次访问返回相同的值时,智能转换才有效。如果要访问的属性是在与访问位置不同的模块中定义的,则包含该属性的模块可以与访问它的模块分开重新编译,从而打破了智能转换的关键要求。因此,不允许跨模块智能投射。
David Rawson 展示了如何修复它,但没有解释为什么您的代码不起作用。
原因是column.second
原则上可以为两个调用返回不同的值;即使Pair#second
是 a val
,它也可以有一个自定义的 getter 方法。
如果Pair
在同一个模块中,编译器可以检查这一点,但对于其他模块则不会。