なぜ一連のユニットがnullを保持できるのですか?
-
27-10-2019 - |
質問
Unit
のサブタイプであるように指定されています AnyVal
(そしてその唯一の価値はです ()
)、それで、なぜこれが可能なのか:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)
これは、REPLのアレイ印刷メカニズムのバグ/省略なのでしょうか、それともその理由はありますか?
解決 3
Scala 2.9のために修正されましたが、現在印刷しています。
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array((), (), (), (), ())
他のヒント
これは、配列の初期化による問題/制限だと思います。プリミティブ値の場合、アレイはデフォルト値に初期化されます。ネイティブアレイを活用するSCALAアレイにより、JVMによって推定されます。
他のタイプの場合、値はオブジェクトにラップされ、nullとして初期化されるようです。
ユニットの配列が必要な場合は、電話する必要がある場合があります 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
.
所属していません StackOverflow