val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)
Was ist der sichere Weg, um null: java.lang.Integer
zu Scala zu konvertieren Option[Int]
?
val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)
Was ist der sichere Weg, um null: java.lang.Integer
zu Scala zu konvertieren Option[Int]
?
Antworten:
Sie mischen Int
und java.lang.Integer
so
val i: java.lang.Integer = null
val o: Option[Int] = Option(i)
konvertiert implizit in
val o: Option[Int] = Option(Integer2int(i))
was wird
val o: Option[Int] = Option(null.asInstanceOf[Int])
somit
val o: Option[Int] = Some(0)
Wenn Sie mit arbeiten möchten java.lang.Integer
, schreiben Sie
val o: Option[java.lang.Integer] = Option(i)
// o: Option[Integer] = None
Option[Integer](i).map(_.intValue)
scheint mir am idiomatischsten zu sein, da es sagt, was es tut. Verwenden Sie auch -Xlint
, um die Warnung für die val o
!
Integer
abgeleitet.
Dies scheint zu geschehen, weil Sie das erstellen Option
und es Int
in einem Schritt in ein konvertieren (die Antwort von @ MarioGalic erklärt, warum dies geschieht).
Das macht was du willst:
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)
_.intValue
. Ich denke, es speichert nur den Conversion-Aufruf.
Konnte das gleiche Problem vor. Dieses fragwürdige Verhalten ist dem Scala-Team bekannt. Scheint, als würde eine Änderung etwas anderes zerstören. Siehe https://github.com/scala/bug/issues/11236 und https://github.com/scala/scala/pull/5176 .
null
als Ganzzahl behandelt. Dies ist vermutlich ein Kater, von C
dem aus es in Ordnung ist, 0
einem Zeiger zuzuweisen . Dies bedeutet jedoch nicht, dass der resultierende Zeiger ist 0
, so dass es zweifelhaft ist , auch in zwischen den beiden zu wechseln C
.
Integer
Höchstwahrscheinlich stammt es aus Java-Code, daher ist "Null nicht als Ganzzahl behandeln" kein umsetzbarer Rat. Und wir überprüfen diese Ganzzahl explizit auf Nullfähigkeit mit Option.apply
. Wir erhalten also eine unerwartete Ausgabe, ohne explizit unsichere Operationen auszuführen.
JavaConverters
eher als JavaConversion
)
theInteger.intValue()
. Das Vermeiden dieses Absturzes kostet eine zusätzliche Laufzeitprüfung. In älteren Versionen von Scala führte diese Konvertierung tatsächlich zu einer NPE. Es wurde als Fehler gemeldet und auf das aktuelle Verhalten behoben. Ich bin kein Scala-Experte, aber ich habe Scala-Dev # 355 und Scala # 5176 als historischen Kontext ausgegraben .