Scala Option(null) expected as None but I got Some(0)

前端 未结 3 652
囚心锁ツ
囚心锁ツ 2021-01-17 14:29
val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)

What is the safe wa

相关标签:
3条回答
  • 2021-01-17 14:57

    You are mixing Int and java.lang.Integer so

    val i: java.lang.Integer = null
    val o: Option[Int] = Option(i)
    

    implicitly converts to

    val o: Option[Int] = Option(Integer2int(i))
    

    which becomes

    val o: Option[Int] = Option(null.asInstanceOf[Int])
    

    thus

    val o: Option[Int] = Some(0)
    

    If you want to work with java.lang.Integer, then write

    val o: Option[java.lang.Integer] = Option(i)
    // o: Option[Integer] = None
    
    0 讨论(0)
  • 2021-01-17 15:12

    This seems to be happening because you are creating the Option, and converting it to an Int in one step (@MarioGalic's answer explains why this is happening).

    This does what you want:

    scala> val o: java.lang.Integer = null
    o: Integer = null
    
    scala> val i: Option[Int] = Option(o).map(_.toInt)
    i: Option[Int] = None
    
    scala> val o1: java.lang.Integer = 1
    o1: Integer = 1
    
    scala> val i1: Option[Int] = Option(o1).map(_.toInt)
    i1: Option[Int] = Some(1)
    
    0 讨论(0)
  • 2021-01-17 15:14

    Faced the same issue before. This questionable behavior is known by the Scala team. Seems that changing it breaks something elsewhere. See https://github.com/scala/bug/issues/11236 and https://github.com/scala/scala/pull/5176 .

    0 讨论(0)
提交回复
热议问题