由于?运算符,编译在Kotlin中失败

yftpprvb  于 2023-03-09  发布在  Kotlin
关注(0)|答案(1)|浏览(119)

我试着去理解下面的情节。

inline fun Any?.what(ifNotNull: (Any) -> Unit, ifNull: () -> Unit) {
    if (this == null) {
        ifNull()
    } else {
        ifNotNull(this)
    }
}

@OptIn(ExperimentalContracts::class)
@JvmSynthetic
inline fun <T> T?.whatIfNull(
    whatIfNot: (T) -> Unit,
    whatIf: () -> Unit,
) {
    contract {
        callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
        callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
    }
    if (this != null) {
        whatIfNot(this)
    } else {
        whatIf()
    }
}

fun main() {
    null?.what(
        ifNull = {
            println("It Works!")
        },
        ifNotNull = {
            println("It not working!!")
        },
    )
    null?.whatIfNull(
        whatIf = {
            println("It Works!")
        },
        whatIfNot = {
            println("It not working!!")
        },
    )
}

当我编译这段代码时,我得到了类似于main的东西。

public static final void main() {   }

当我移除null后面的?操作符时,比如null.whatIfNull(将得到

public static final void main() {
      Object $this$whatIfNull$iv = null;
      int $i$f$whatIfNull = false;
      int var2 = false;
      String var3 = "It Works!";
      System.out.println(var3);
   }

我也在试着理解这一点。看起来它只是在删除?之后才编译的。
这个问题的原因可能是什么?有没有具体的博客或文章?请发表评论,或请解释我。谢谢。

3j86kqsm

3j86kqsm1#

问题是当你写null?.<anythinghere>的时候,它已经知道<anythinghere>是不可达的,所以它就把它忽略了。你可能认为null?Any?的值,但是它不是。所以它不匹配。考虑下面的代码:

fun main() {
    val a = null
    println(a?.test())
    println(a.test())
}

fun Any?.test() : String {
    return "Test"
}

输出将为:

null
Test

在编写null?时,您有第一种情况的示例,这意味着它永远不会执行它后面的任何内容。

相关问题