Question

Unit est spécifié comme un sous-type de AnyVal (et sa seule valeur est ()), alors pourquoi est-ce possible:

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)

Est-ce juste un bug / omission dans le mécanisme d'impression de tableau de REPL ou est-il une raison?

Était-ce utile?

La solution 3

Il a été fixé pour Scala 2.9 et imprime maintenant:

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array((), (), (), (), ())

Autres conseils

Je pense que cela est un problème / limitation avec l'initialisation du tableau. Pour les valeurs primitives tableaux sont initialisés à leur valeur par défaut I présumée par la machine virtuelle Java en vertu de tableaux Scala tirant parti des réseaux natifs.

Pour les autres types, la valeur serait enveloppé dans un objet, il semble qu'ils viennent initialisés comme nulle.

Si vous voulez un tableau de l'unité, vous devrez peut-être appel val units = Array.fill(5)(()).

NULL est, vraisemblablement, ne devait apparaître dans cette représentation de chaîne. Dès que vous obtenez une valeur hors du tableau, il est « unboxed » à Unit:

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)

scala> units(0)
// note: no result

Comparer avec:

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

Il y avait une discussion similaire cette question avec Nothing au lieu de Unit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top