我正在查看哈希表的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/

10-15 08:40