Когда я изучал исходный код Scala версии 2.11.8, я обнаружил аспект HashMap
, который меня смутил:
Я заметил, что есть две черты HashMap
для mixin, прямо или косвенно,которые оба определили ++
метод:
Кажется, что обе эти черты принимают тип 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
Большое спасибо за все ваши усилия по этому вопросу заранее.