Как scala HashMap наследует метод "++", в то время как оба суперкласса TraversableLike и MapLike имеют одинаковое имя метода - PullRequest
0 голосов
/ 23 ноября 2018

Когда я изучал исходный код Scala версии 2.11.8, я обнаружил аспект HashMap, который меня смутил:

Я заметил, что есть две черты HashMap для mixin, прямо или косвенно,которые оба определили ++ метод:

  • 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"))
  }

Во время процесса отладки я получил разные результаты этого метода 2, то есть метод addElements1 наследует метод ++ от признака TraversableLike.Метод addElements2 наследует метод ++ от черты MapLike.

Существует ли очевидное правило или условие, для которого метод должен использоваться для HashMap?

К вашему сведению: цепочка наследования HashMap от этих 2 признаков:

HashMap <- MapLike
HashMap <- Map <- Iterable <- Traversable <- TraversableLike 

Большое спасибо за все ваши усилия по этому вопросу заранее.

...