Warum kann eine Reihe von Einheiten Null halten?
-
27-10-2019 - |
Frage
Unit
wird als Subtyp von angegeben AnyVal
(und sein einziger Wert ist ()
), warum ist das möglich:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)
Ist dies nur ein Fehler/Auslassung im Array -Druckmechanismus der Repla -Array oder gibt es einen Grund dafür?
Lösung 3
Es wurde für Scala 2.9 befestigt und jetzt Drucke:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array((), (), (), (), ())
Andere Tipps
Ich denke, dies ist eine Ausgabe/Einschränkung bei der Array -Initialisierung. Für primitive Werte werden Arrays auf ihren Standardwert initialisiert, den ich vom JVM vermutet, weil Scala -Arrays native Arrays nutzen.
Für andere Typen würde der Wert in ein Objekt eingewickelt, es scheint, dass sie als Null initialisiert werden.
Wenn Sie eine Reihe von Einheiten wünschen, müssen Sie möglicherweise anrufen val units = Array.fill(5)(())
.
Der Null soll vermutlich nur in dieser String -Darstellung erscheinen. Sobald Sie einen Wert aus dem Array herausholen, ist es „unboxiert“ zu einem Wert Unit
:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)
scala> units(0)
// note: no result
Vergleichen mit:
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
Es gab eine ähnliche Diskussion in diese Frage mit Nothing
Anstatt von Unit
.