NotNull

NotNull型を継承すれば、自分で作った型に関しては、nullが入らないことを静的に保証することができます。 class X extends NotNull { ... } とすると、X型の変数にはnullが入れられません。

http://twitter.com/kmizu/status/21992714816

やってみる。

scala> val f:String = "a"
f: String = a

scala> val f:String = null
f: String = null

scala> val f:String with NotNull = "a"
f: String with NotNull = a

scala> val f:String with NotNull = null
<console>:4: error: type mismatch;
 found   : Null(null)
 required: String with NotNull
       val f:String with NotNull = null

おー!

scala> def hoge(s:String) = "hoge" + s
hoge: (String)java.lang.String

scala> hoge("aa")
res2: java.lang.String = hogeaa

scala> hoge("")
res3: java.lang.String = hoge

scala> hoge(null)
res4: java.lang.String = hogenull
scala> def hoge2(s:String with NotNull) = "hoge" + s
hoge2: (String with NotNull)java.lang.String

scala> hoge2("aa")
res5: java.lang.String = hogeaa

scala> hoge2("")
res6: java.lang.String = hoge

scala> hoge2(null)
<console>:6: error: type mismatch;
 found   : Null(null)
 required: String with NotNull
       hoge2(null)

おーー!
これはいい!

  • 追記

NotNull から Nullable への変換はやってくれるが、
Nullable から NotNull への変換はやってくれない。
(そりゃそっか)

scala> class A
defined class A

scala> val a:A with NotNull = new A
<console>:5: error: type mismatch;
 found   : A
 required: A with NotNull
       val a:A with NotNull = new A
                              ^
scala> val a = new A with NotNull
a: A with NotNull = $anon$1@5561bfa3