【问题标题】:Smart cast an Arrow-kt Option智能投射 Arrow-kt 选项
【发布时间】:2018-07-22 13:49:52
【问题描述】:

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

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

【问题讨论】:

    标签: kotlin arrow-kt


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Alexey 解释错误原因。
    • 这里你有一个关于 Kotlin 社区的讨论,他们解释的和 Alexey Romanov 说的一样。在这种情况下,问题是关于从另一个模块到应用程序的智能投射。 discuss.kotlinlang.org/t/…
    【解决方案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 问题跟踪器here 上解释了为什么不允许跨模块智能转换:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多