5

toArrayfor hashmapsの定義を見ていました:

http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.HashMap

それは持っています

toArray: Array[A]
def toArray[B >: (A, B)](implicit arg0: ClassTag[B]): Array[B]

私はこれをよく理解していません.最初のビットはArray[A]を取得すると言っていますが、2番目の部分はArray[B]を取得すると言っています? これらはどちらも私が期待するものではありません - Array[(A,B)]

自分で確認すると:

scala> val x = scala.collection.mutable.HashMap[String, Int]()
x: scala.collection.mutable.HashMap[String,Int] = Map()

scala> x.put("8", 7)
res0: Option[Int] = None

scala> x foreach println
(8,7)

scala> x.toArray
res2: Array[(String, Int)] = Array((8,7))

なぜtoListに似ていないのですか?

toList: scala.List[(A, B)]
4

3 に答える 3

2

の Scaladoc に表示される API toArray:

def toArray[B >: (A, B)](implicit arg0: ClassTag[B]): Array[B]

以下と同等です。

def toArray[C >: (A, B)](implicit arg0: ClassTag[C]): Array[C]

型変数の選択Bは本当に残念です (そして、Scaladoc のバグでさえあるかもしれませんが、それを書くことが許されているかどうかはわかりません)。

(A,B) これは基本的に、 aClassTagが利用可能な最も具体的なスーパータイプの配列を取得することを意味します。を作成するには、ClassTagが必要ですArray

これは基本的に、コンパイル時に、Map変換する の実行時の型が完全にわかっている場合、Array[(A,B)]. ただし、Mapどこかをアップキャストした場合、結果Arrayの実行時の型は、実行時の型ではなく、アップキャストされた型に依存します。これtoList、ネイティブ配列の作成方法に関する JVM の制限とは異なる動作です。

于 2013-06-24T14:38:25.897 に答える