Kotlin 智能投射箭头kt选项

Kotlin 智能投射箭头kt选项,kotlin,arrow-kt,Kotlin,Arrow Kt,我试图从任何变量智能转换一个选项,以便确定该选项是否为空,但是IDE指示该选项不能智能转换,因为它在不同的模块中声明 fun hasEmptyValue(column: Pair<String, Any>): Boolean = when { column.second is Option<*> -> column.second.isEmpty() else -> false } fun hasEmptyValue(列:对):布尔值=何时

我试图从任何变量智能转换一个选项,以便确定该选项是否为空,但是IDE指示该选项不能智能转换,因为它在不同的模块中声明

fun hasEmptyValue(column: Pair<String, Any>): Boolean = when {
    column.second is Option<*> -> column.second.isEmpty()  
    else -> false
}
fun hasEmptyValue(列:对):布尔值=何时{
column.second是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
    }
}
fun hasEmptyValue(列:对):布尔值{
val second=column.second
返回时间(秒){
is Option->second.isEmpty()//智能转换为arrow.core.Option
else->false
}
}
Jetbrains问题追踪器上解释了为什么不允许跨模块智能转换:

只有当同一属性的多个访问保证返回相同的值时,智能强制转换才有效。如果正在访问的属性定义在与访问位置不同的模块中,则包含该属性的模块可以与访问该属性的模块分开重新编译,从而打破智能强制转换的密钥要求。因此,不允许跨模块智能转换


以下是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
    }
}
fun hasEmptyValue(列:对):布尔值{
val second=column.second
返回时间(秒){
is Option->second.isEmpty()//智能转换为arrow.core.Option
else->false
}
}
Jetbrains问题追踪器上解释了为什么不允许跨模块智能转换:

只有当同一属性的多个访问保证返回相同的值时,智能强制转换才有效。如果正在访问的属性定义在与访问位置不同的模块中,则包含该属性的模块可以与访问该属性的模块分开重新编译,从而打破智能强制转换的密钥要求。因此,不允许跨模块智能转换


David Rawson展示了如何修复它,但没有解释为什么代码不能工作

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


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

David Rawson演示了如何修复它,但没有解释代码不工作的原因

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


如果
Pair
在同一个模块中,编译器可以检查这一点,但对于其他模块则不能。谢谢Alexey解释了错误的原因。在这里,你与Kotlin社区讨论了这一点,他们的解释与Alexey Romanov所说的相同。在这种情况下,问题是关于从另一个模块到应用程序的智能转换。感谢Alexey解释了错误的原因。在这里,你与Kotlin社区进行了讨论,他们的解释与Alexey Romanov所说的相同。在这种情况下,问题是关于从另一个模块到应用程序的智能转换。