Scala と null と 型パラメータ

追記 3/24 コメントでご指摘頂いたとおり、 Scala では null よりも Option を使う方が望ましいと思います。
この記事は、 JavaScala 両方を使ったプログラムを書いている時に、 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 のスーパークラスだよぉって教えてあげるんですね。

f:id:rinu:20130301014000p:plain


Scala ではプリミティブとオブジェクトに共通の Any クラスがあるので、こうしないと T と Null の関係は以下のようになってしまって、 null は T ではないと言われてしまうんです(か?)。

f:id:rinu:20130301015540p:plain

この件、ちょっとハマってしまって。。
こんなふうにしたりして、「ダメだぁ。。」って悩んでました。

  def foo2[T <: AnyRef](t: T): T = {
    if (true) t
    else null
  }

これはクラス図で言うと、こんな感じ ↓ なので、ダメなんですね。。

f:id:rinu:20130301014100p:plain

たぶんね。。。

(ホントは Option を使うのがいいのでしょうね)