Почему множество подразделений может удерживать нуль?
-
27-10-2019 - |
Вопрос
Unit
указан как подтип AnyVal
(И его единственное значение ()
), так почему это возможно:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)
Это просто ошибка/упущение в механизме печати реплики или есть причина для этого?
Решение 3
Это было зафиксировано для Scala 2.9 и теперь отпечатки:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array((), (), (), (), ())
Другие советы
Я думаю, что это проблема/ограничение с инициализацией массива. Для примитивных значений массивы инициализируются до их значения по умолчанию, которое я предполагал JVM в силу массивов Scala, использующих нативные массивы.
Для других типов значение будет завершено в объект, кажется, они становятся инициализированными как нулевые.
Если вы хотите массив устройства, вам может потребоваться позвонить val units = Array.fill(5)(())
.
Нолл, по -видимому, должен появляться только в этом строковом представлении. Как только вы получите ценность из массива, он «распакован» Unit
:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)
scala> units(0)
// note: no result
Сравнить с:
scala> val refs = new Array[AnyRef](5)
refs: Array[AnyRef] = Array(null, null, null, null, null)
scala> refs(0)
res0: AnyRef = null // we do get the null here
Была аналогичная дискуссия в Этот вопрос с Nothing
вместо Unit
.