Kotlin 科特林-布尔运算是如何实现的?in-if表达式对字节码有效
我知道在Kotlin中使用可空布尔值的习惯用法是: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;()
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运算符),否则它将无法编译