概要
勘違いをしてしまっていたため、備忘録的に残します。
val flag : Boolean? = null
falg == true // false
flag == false // false <- 無意識にtrueが返ってくると思い込んでいた
nullなBooleanに == true も == false をしてもどちらも false になる。
以下のような思い込みがあった
- あるオブジェクトへ
== trueを行った結果がfalseの場合、==falseの比較をした結果はtrueになる -
nullに対して==falseをした時にtrueになる。-
falseに何となくマイナス属性なイメージでも持ってしまっていていて、==nullをした時にtrueが返るとでも思っていたのだと思う。falseはただのBooleanの片方の値でしかないのに。
-
当たり前だが、nullは 「値が存在しない」ことを表現しており、trueでもfalseにもなれない。
ちょっと詳細
null は null との比較でだけtrueになる
Kotlin では Boolean 型は true または false の 2つの値 しか持たない。
一方、null は「値がない」ことを表す特殊な値であり、Boolean の値ではない。比較できない。
nullと比較されてtrueになるのはnullだけ。
== 演算子の動作
Kotlin では == は 構造的等価 をチェックする演算子で、以下のように展開される。
(参照等価性は===)
https://kotlinlang.org/docs/equality.html
a?.equals(b) ?: (b === null)
動作は以下の通り。
1. aがnullじゃない場合はそのままオブジェクトが持つequarls関数を呼び出す
2. aがnullだった場合に、bもnullなのかどうかチェックし最終的な戻り値のtrue/falseを決める。
val flag : Boolean? = null
falg == true // false
flag == false // false <- 無意識にtrueが返ってくると思い込んでいた
冒頭のflag == falseの処理を動かした時には、1の処理を通過し2まで進み、bがnullではないと判定され最終的にfalseが返る、という流れになる。