0

我正在尝试从任何 Any 变量智能转换选项,以便我可以确定选项是否为空,但是 IDE 指示 Option<*> 不能智能转换,因为它是在不同的模块中声明的。

fun hasEmptyValue(column: Pair<String, Any>): Boolean = when {
    column.second is Option<*> -> column.second.isEmpty()  
    else -> false
}
4

2 回答 2

2

以下原因使 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 问题跟踪器上解释了为什么不允许跨模块进行智能转换:

仅当保证对同一属性的多次访问返回相同的值时,智能转换才有效。如果要访问的属性是在与访问位置不同的模块中定义的,则包含该属性的模块可以与访问它的模块分开重新编译,从而打破了智能转换的关键要求。因此,不允许跨模块智能投射。

于 2018-07-07T09:25:11.933 回答
2

David Rawson 展示了如何修复它,但没有解释为什么您的代码不起作用。

原因是column.second原则上可以为两个调用返回不同的值;即使Pair#second是 a val,它也可以有一个自定义的 getter 方法。

如果Pair在同一个模块中,编译器可以检查这一点,但对于其他模块则不会。

于 2018-07-07T11:09:24.000 回答