概要
勘違いをしてしまっていたため、備忘録的に残します。
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
が返る、という流れになる。