Oderskyの本「ProgramminginScala」の第2版、セクション5.7(89ページ)では、「==」演算子は次のように説明されています。
「ご覧のとおり、==は、ほとんどの場合に必要な等式比較が得られるように慎重に作成されています。これは、非常に単純なルールで実現されます。最初に左側でnullを確認し、nullでない場合は、 equalsメソッド...自動ヌルチェックがあるので、自分でチェックする必要はありません(7)」
次に、メモ「7」:
「自動チェックは右側を調べませんが、引数がnullの場合、適切なequalsメソッドはfalseを返す必要があります。」
nullチェックがRHSを調べない場合、null ==何かが常にfalseと評価されることを期待していました...しかし、試してみたところ、null==nullはtrueと評価されました。
この本はscala2.8に基づいています。ある時点で言語が変わったのでしょうか、それとも説明を理解していなかったのでしょうか。
私が使用したdroolsエンジンでは、==は、LHSがnullで、RHSがnullでない場合、RHSのequalsメソッドがLHSに渡されるように解釈されました。最も合理的なequalsメソッドはnullに対してfalseを返すはずですが、私はdroolsエンジンがこれを処理する方法が好きでした。SQLでは、null!=nullに慣れています。