Черты XXXLike играют важную роль в добавлении универсального параметра Repr. Методы, которые должны возвращать один и тот же тип коллекции, такие как filter, map, flatMap, реализованы в низкоуровневых чертах (TraversableLike). Чтобы закодировать их тип возврата, эти черты получают его:
trait TraversableLike[+A, +Repr] ...
...
def filter(p: A => Boolean): Repr = {
(для карты и плоской карты проблема более сложная, я не буду вдаваться в подробности)
Теперь скажите, что у вас есть новый тип коллекции. Вы могли бы сделать:
trait MyCollection[+A] extends TraversableLike[A, MyCollection]
Но если кто-то захочет расширить вашу коллекцию, он застрянет с возвращаемыми значениями MyCollection из различных унаследованных методов.
Итак, вместо этого вы создаете:
trait MyCollectionLike[+A, +Repr] extends TraversableLike[A, Repr]
и
trait MyCollection[+A] extends MyCollectionLike[A, MyCollection]
и любой, кто хочет расширить вашу коллекцию, расширяет MyCollectionLike