社内で以下のScalaコードがコンパイルエラーにならないというのが盛り上がっていた。
println(1 == "a") // コンパイル通るし結果はfalseになる
普段ElmとGoばっかり書いている&Scalaのことをとりあえず型に厳しい言語だと思いこんでいたこともあり若干意外だったが、調べてみると以下の記事が詳しかった。
IntegerもStringも等価比較の際、内部的には Any
型を比較対象の引数に取る java.lang.Object#equals
メソッドが呼ばれるため、比較対象がどんな型であってもコンパイラー的にはエラーにならない。ElmやGoと異なりScalaはこういうものらしい。
ちなみにScastieだと次のような警告がでる。
comparing values of types Int and String using `==` will always yield false
IDEやsbtで出るようなこういう警告を事前にちゃんと潰しておく、あるいは等価比較ではなくパターンマッチを使ってコンパイルエラーにすれば、こういう比較周りの挙動の罠には気づけるかもしれない。