当我学习2.11.8版的Scala源代码时,发现HashMap
的一个方面令我感到困惑:
我注意到HashMap
有2个直接或间接混合特性,都定义了++
方法:
TraversableLike
MapLike
似乎这两个特征都以GenTraversableOnce
类型作为参数,但是区别在于TraversableLike
特征为隐式CanBuildFrom
定义了另一个参数列表,但是在HashMap.scala
中,在范围内还定义了一个隐式CanBuildFrom
,但我不知道HashMap的哪个++
方法将从这两个特征之间继承,即是否使用隐式CanBuildFrom
。请看下面我的测试示例:
//the paramter list for implicit ev is just evidence to limit the (A,B) as subtypes of (Int,String), to confirm with the expected return type.
def addElements1[A,B](t: (A,B)*)(implicit ev: <:<[(A,B),(Int,String)]): HashMap[Int,String] = {
val h = new HashMap[Int,String]
h ++ t
h
}
def addElements2[A,B](t: (A,B)*): HashMap[A,B] = {
val h = new HashMap[A,B]
h ++ t
h
}
def main(args: Array[String]): Unit = {
addElements1((1,"a"),(2,"b"),(3,"c"))
addElements2((4,"d"),(5,"e"),(6,"f"))
}
在调试过程中,我得到了两种方法的不同结果,即方法addElements1
从特征++
继承了方法TraversableLike
。方法addElements2
从特征++
继承方法MapLike
。
对于HashMap
应该使用哪种方法有明显的规则或条件?
仅供参考:HashMap
从这两个特征的继承链为:
HashMap <- MapLike
HashMap <- Map <- Iterable <- Traversable <- TraversableLike
非常感谢您在此问题上的所有努力。