Kotlin 科特林-布尔运算是如何实现的?in-if表达式对字节码有效

Kotlin 科特林-布尔运算是如何实现的?in-if表达式对字节码有效,kotlin,bytecode,Kotlin,Bytecode,我知道在Kotlin中使用可空布尔值的习惯用法是: fun nullableBoolean(b: Boolean?) { if (b == true) { println("is true") } } 我很好奇引擎盖下发生了什么。这是该函数生成字节码的有趣部分: public final static nullableBoolean(Ljava/lang/Boolean;)V @Lorg/jetbrains/annotations/Nullable;()

我知道在Kotlin中使用可空布尔值的习惯用法是:

fun nullableBoolean(b: Boolean?) {
    if (b == true) {
        println("is true")
    }
}
我很好奇引擎盖下发生了什么。这是该函数生成字节码的有趣部分:

public final static nullableBoolean(Ljava/lang/Boolean;)V
    @Lorg/jetbrains/annotations/Nullable;() // invisible, parameter 0
   L0
    LINENUMBER 4 L0
    ALOAD 0
    ICONST_1
    INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.areEqual (Ljava/lang/Object;Ljava/lang/Object;)Z
    IFEQ L1
    ...

我可以看到,
Intrinsics.areEqual
执行空检查。但是我不明白当引用为
null
Boolean时,调用
java/lang/Boolean.valueOf
会发生什么情况。valueOf
是在常量
true
上调用的,以便创建一个装箱布尔对象。然后将其与传递给函数的值进行比较。

Boolean。将对常量
true
调用valueOf
,以创建装箱布尔对象。然后将其与传递给函数的值进行比较。

@cricket\u 007不,您不能t@cricket_007如前所述,您不能这样做,因为
b
可以为null,除非我们使用
==
或以某种方式处理可为null的内容(如使用elvis运算符)不会的compile@cricket_007不,你不能t@cricket_007如前所述,您不能这样做,因为
b
可以为null,因此除非我们使用
==
或以某种方式处理可为null的内容(如使用elvis运算符),否则它将无法编译