Это где-то недавно спрашивали, так что это настоящая ошибка. Возможно, проблема в том, чтобы полагаться на умозаключение: Option[Integer](i).map(_.intValue)мне это кажется наиболее идиоматичным, поскольку в нем говорится, что он делает. Кроме того, используйте, -Xlintчтобы увидеть предупреждение для val o!
Сом-Снитт
Чтобы избежать обхода в боксе, `val x: Option [Int] = Option (i) .asInstanceOf [Option [Int]]` где Integerвыводится.
Сом-Снитт
7
Похоже, это происходит потому, что вы создаете Optionи конвертируете его Intв один шаг ( ответ @ MarioGalic объясняет, почему это происходит).
Действительно сомнительное поведение - nullэто целое число. Предположительно это похмелье, с Cкоторого можно назначить 0указатель. Но это не означает, что результирующий указатель есть 0, поэтому переключаться между ними даже хитроумно C.
Тим
IntegerСкорее всего, это был Java-код, поэтому «не рассматривайте ноль как целое число» не является практическим советом. И мы явно проверяем это целое число на обнуляемость, используя Option.apply. Таким образом, мы получаем неожиданный вывод без явного выполнения небезопасных операций.
Simpadjo
Дело в том, что вы не можете обвинять Scala в «сомнительном поведении», когда основной причиной является Java. Практический совет - иметь явное преобразование типов Java в эквивалентные типы Scala, а не использовать неявное преобразование. (Следовательно, JavaConvertersа не JavaConversion)
Тим
1
Что ж, я могу обвинить Scala в том, что она не выдала ошибку / предупреждение компиляции в этом случае. Даже сбой во время выполнения будет лучше. Даже в моей компании 2 разработчика с опытом работы в Scala более 5 лет столкнулись с этой проблемой.
Simpadjo
1
@Tim Было бы очень легко получить сбой во время выполнения, просто позвонив theInteger.intValue(). Предотвращение этого сбоя - это дополнительная проверка во время выполнения. В старых версиях Scala это преобразование действительно создавало NPE; это было сообщено как ошибка, и исправлено к текущему поведению. Я не эксперт по Scala, но я выкопал scala-dev # 355 и scala # 5176 как исторический контекст.
Ответы:
Вы смешиваете
Int
иjava.lang.Integer
такнеявно преобразуется в
который становится
таким образом
Если хочешь работать
java.lang.Integer
, то пишиисточник
Option[Integer](i).map(_.intValue)
мне это кажется наиболее идиоматичным, поскольку в нем говорится, что он делает. Кроме того, используйте,-Xlint
чтобы увидеть предупреждение дляval o
!Integer
выводится.Похоже, это происходит потому, что вы создаете
Option
и конвертируете егоInt
в один шаг ( ответ @ MarioGalic объясняет, почему это происходит).Это делает то, что вы хотите:
источник
_.intValue
. Я думаю, это только сохраняет конверсионный звонок.Столкнулся с той же проблемой раньше. Это сомнительное поведение известно команде Scala. Кажется, что изменение его ломает что-то в другом месте. См. Https://github.com/scala/bug/issues/11236 и https://github.com/scala/scala/pull/5176 .
источник
null
это целое число. Предположительно это похмелье, сC
которого можно назначить0
указатель. Но это не означает, что результирующий указатель есть0
, поэтому переключаться между ними даже хитроумноC
.Integer
Скорее всего, это был Java-код, поэтому «не рассматривайте ноль как целое число» не является практическим советом. И мы явно проверяем это целое число на обнуляемость, используяOption.apply
. Таким образом, мы получаем неожиданный вывод без явного выполнения небезопасных операций.JavaConverters
а неJavaConversion
)theInteger.intValue()
. Предотвращение этого сбоя - это дополнительная проверка во время выполнения. В старых версиях Scala это преобразование действительно создавало NPE; это было сообщено как ошибка, и исправлено к текущему поведению. Я не эксперт по Scala, но я выкопал scala-dev # 355 и scala # 5176 как исторический контекст.