Неожиданное поведение при создании опции Scala из java.lang.Long - PullRequest
0 голосов
/ 10 октября 2018

Учитывая следующий код:

val javaLong: java.lang.Long = null
val opt: Option[Long] = Option(javaLong)

Я ожидал, что opt будет None, но по некоторым причинам это Some(0).Я также обнаружил эту ошибку , и кажется, что неявное преобразование происходит до применения метода опции.Я думаю, что это все еще ошибка, потому что никто не ожидал бы такого поведения, и мне интересно, есть ли обходной путь или какие-то лучшие способы обернуть нули.

Обновление : приведенный выше код толькоупрощенный кусок.Реальный пример - что-то вроде:

Person(Option(doc.getLong()))

, где Person это:

 case class Person(id: Option[Long])

, а метод doc.getLong() - это java-метод, который возвращает java.lang.Long

1 Ответ

0 голосов
/ 10 октября 2018

Преобразование в Option[Long] на самом деле не просто преобразование в Option, но и неявное приведение к Scala * Long из Java * Long.

val javaLong: java.lang.Long = null
// javaLong: Long = null

val long: java.lang.Long = javaLong
// long: Long = null
val long: Long = javaLong
// long: Long = 0

Сначала у нас есть неявное преобразование из Java Long в Scala Long, которое, очевидно, производит 0 из null.

Только тогда мы имеемпреобразование в Option.

Если мы указываем Java Long как тип нашего Option, тогда мы получаем None, а не Some(0):

val opt: Option[java.lang.Long] = Option(javaLong)
// opt: Option[Long] = None (here it's Java's Long)

И, наконец, мы можем разыграть Option[java.lang.Long], чтобы использовать Scala s Long:

val opt: Option[Long] = Option(javaLong).map(_.toLong)
// opt: Option[Long] = None (here it's Scala's Long)
...