当两个超类TraversableLike和MapLike具有相同的方法名称时,scala HashMap如何继承“ ++”方法

时间:2018-11-23 10:06:59

标签: scala hashmap scala-collections

当我学习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 

非常感谢您在此问题上的所有努力。

0 个答案:

没有答案