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