Runner in the High

技術のことをかくこころみ

ScalaではIntとStringを比較してもコンパイルエラーにならない

社内で以下のScalaコードがコンパイルエラーにならないというのが盛り上がっていた。

println(1 == "a") // コンパイル通るし結果はfalseになる

普段ElmとGoばっかり書いている&Scalaのことをとりあえず型に厳しい言語だと思いこんでいたこともあり若干意外だったが、調べてみると以下の記事が詳しかった。

stackoverflow.com

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で出るようなこういう警告を事前にちゃんと潰しておく、あるいは等価比較ではなくパターンマッチを使ってコンパイルエラーにすれば、こういう比較周りの挙動の罠には気づけるかもしれない。