Scala と null と 型パラメータ
追記 3/24 コメントでご指摘頂いたとおり、 Scala では null よりも Option を使う方が望ましいと思います。
この記事は、 Java と Scala 両方を使ったプログラムを書いている時に、 null を扱う必要があって悪戦苦闘していた時の記録です(*ノωノ*)
Option については、以下の様なブログが参考になりますー
http://yuroyoro.hatenablog.com/entry/20100710/1278763193
Scala で型パラメータ T 型の関数から null を返したい時
つまり、こんなことがしたい時、
def foo[T](t: T): T = { if (true) t else null }
こんなエラーになっちゃいます。
Expression of type Null doesn't conform to expected type T. (by IDEA)
こんな時は、こうすればいいのかな?
(もっとシンプルなやり方あるのかしら。。)
def foo2[T >: Null](t: T): T = { if (true) t else null }
これはつまり、 T は null のクラスである Null のスーパークラスだよぉって教えてあげるんですね。
Scala ではプリミティブとオブジェクトに共通の Any クラスがあるので、こうしないと T と Null の関係は以下のようになってしまって、 null は T ではないと言われてしまうんです(か?)。
この件、ちょっとハマってしまって。。
こんなふうにしたりして、「ダメだぁ。。」って悩んでました。
def foo2[T <: AnyRef](t: T): T = { if (true) t else null }
これはクラス図で言うと、こんな感じ ↓ なので、ダメなんですね。。
たぶんね。。。
(ホントは Option を使うのがいいのでしょうね)