0

我执行一个函数 ( listOf(matchUid, first_name, gender, matchBio, age).any { it == null }) 检查传入的任何变量是否为null

private fun getMatchData(doc: DocumentSnapshot){
    val matchUid = if (isUser1) doc.getString("user2") else doc.getString("user1")
    val first_name = if (isUser1) doc.getString("user2name") else doc.getString("user1name")
    val gender = if (isUser1) doc.getString("user2gender") else doc.getString("gender")
    val matchBio = if (isUser1) doc.getString("user2bio") else doc.getString("user1bio")
    if ( listOf(matchUid, first_name, gender, matchBio, age).any { it == null } ) return goOffline()
    if (matchUid == null) return goOffline()
    if (!isUser1) Group = Group().apply {
        id = doc.id
        user1 = matchUid
        user2 = user.uid
        match = User(matchUid, first_name, gender, null, true)
    } 

即使它检查了这一点,first_name并且gender由于 null 安全性,编译器也有红色下划线。matchUid没有红线,因为我在下面的行中明确检查了 null。

为什么我已经检查过编译器仍然给出空警告?

4

1 回答 1

2

所以,问题是编译器不够聪明,或者......我们没有提供足够的信息。

在您的情况下,您确保firstName并且gender不为空的有问题的调用是:

if (listOf(matchUid, firstName, gender, matchBio, age).any { it == null }) return goOffline()

如果您将其更改为简单的空值链,它将正常工作:

if (matchUid == null || firstName == null || gender == null || matchBio == null || age == null) return goOffline()

那么,这是为什么呢?编译器只是不知道这listOf(vararg objects: Any?).any { it == null }意味着没有一个对象不为空。那么,我们能做些什么呢?

Kotlin 1.3 为我们提供了编写 的很大可能性contracts,这是编译器的一个提示,例如,如果f(x)返回true意味着x不为空。但是,不幸的是,contracts 不支持 varargs 参数(或者我还没有找到一种方法来做到这一点)。

因此,在您的情况下,您可以用单空检查链替换您的调用。

于 2019-10-17T11:04:07.483 回答