我正在查看哈希表的toArray
的定义:
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],但是第二部分说您得到了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)]
最佳答案
scaladoc具有各种细微的错误。这里的问题是您看到的是方法签名的“简化”版本(旨在传达签名的基本部分,并在CanBuildFrom
/map
方法中隐藏诸如flatMap
之类的东西,这实际上是实现细节)。
简化在这里有些困难,似乎没有多大意义。
如果单击“完整签名”链接,您将看到真实签名看起来像:
def toArray[B >: (A, B)](implicit arg0: ClassTag[B]): Array[B]
实际上,这仍然是错误的,因为我们当然不能拥有其中B>:(A,B)的类型B。应该更像是:
def toArray[C >: (A, B)](implicit arg0: ClassTag[C]): Array[C]
问题在于实际上有两个
B
:第一个来自HashMap
类声明本身(HashMap[A, +B]
),而另一个来自其基类中定义的toArray
方法TraversableOnce
(def toArray[B >: A](implicit arg0: ClassTag[B]): Array[B]
)。恰好是scaladoc生成器无法删除B
的两个实例关于scala - 为什么scaladoc说HashMap.toArray返回Array [A]而不是Array [(A,B)]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17277985/