seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

java.lang.Integer をもらって Option[Int] をつくるのは要注意

Java との架け橋的なものをつくると一度はハマるところですね。そういえばあまり Web 上で見かけない気がするので書いておきます。

scala> val i: java.lang.Integer = null
i: java.lang.Integer = null

scala> val opt: Option[Int] = Option(i)
java.lang.NullPointerException
    at scala.Predef$.Integer2int(Predef.scala:360)
    at .<init>(<console>:8)
    at .<clinit>(<console>)
    at .<init>(<console>:11)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
    at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
    at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
    at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
    at java.lang.Thread.run(Thread.java:680)


scala> val opt: Option[Int] = Option[java.lang.Integer](i).map(_.asInstanceOf[Int])
opt: Option[Int] = None

知っていても、なかなか runtime でエラーを見るまでは適切に実装できなかったりします。将来的には言語の方でよしなに対応してくれると嬉しい感じがしますね。