Kotlin - 布尔值如何? in if 表达式适用于字节码
Kotlin - How does Boolean? in if expression works on bytecode
我知道在 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
时调用 java/lang/Boolean.valueOf
会发生什么
正在对常量 true
调用 Boolean.valueOf
以创建一个装箱的布尔对象。然后将其与传递给函数的值进行比较。
我知道在 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
java/lang/Boolean.valueOf
会发生什么
true
调用 Boolean.valueOf
以创建一个装箱的布尔对象。然后将其与传递给函数的值进行比较。