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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top