当前位置: 首页 > 知识库问答 >
问题:

智能强制转换是不可能的,因为…是一个可以改变的属性,这个时候已经改变了

阎阳
2023-03-14

我正在尝试获得一个类,它在kotlin中组合了list、set和map。我希望编写isScalar函数,如果对象只包含一个元素,则该函数应该返回true

import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap
import it.unimi.dsi.fastutil.objects.ReferenceArrayList
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet

class Args {

    var list : ReferenceArrayList<M>? = null

    var set : ReferenceOpenHashSet<M>? = null

    var map : Reference2ReferenceOpenHashMap<M, M>? = null

    fun isEmpty() : Boolean {
        return list === null && set === null && map === null
    }

    fun isScalar() : Boolean {
        if(list !== null && list.size == 1) {
            return true
        }
    }

}

不幸的是它给了我错误的比较

list !== null && list.size == 1

Smart cast to 'ReferenceArrayList<M>' is impossible, because 'list' is a mutable property that could have been changed by this time

更新2

总结一下,就我的理解,在Kotlin中显式地将variable与null进行比较是不可能/不合理的。因为一旦你比较它,下一次你就必须再次用null隐式地用类似.?这样的操作来比较它,而你无法避免这种情况。

共有1个答案

匡凌
2023-03-14

如果您利用null不能等于1(或者其他任何东西,真的)这一事实,则可以使此检查非常简洁:

fun isScalar() : Boolean =
    list?.size == 1

当对list.size的null安全调用返回null时,我们将得到false,因为1!=null。否则,将对size返回的任何值进行比较,这将按照您的预期工作。

通过使用null safe运算符(?.),您可以完全避免智能强制转换。Kotlin为我们提供了聪明的转换来使代码更清晰,这也是它保护我们不被误用的方法之一。Kotlin不会保护我们免受一切(除以零,例如,在注释中使用的例子)。您的代码正陷入一个智能转换可能出错的合法案例中,因此Kotlin跳了进来提供帮助。

 类似资料: