Я смотрю на реализацию Scala Collections в версии 2.12 и у меня возник вопрос по поводу дизайна. Здесь используются некоторые «типы абстракций»:
$Coll$Like
Gen$Coll$Like
Gen$Coll$
Насколько я понимаю, признаки Gen$Coll$Like
существуют исключительно с целью повторного использования объявлений (не определений), то есть все методы в признаках Gen$Coll$Like
являются абстрактными.
$Coll$Like
в свою очередь объявляет несколько абстрактных методов и реализует остальные методы Gen$Coll$Like
через них. Кроме того, $Coll$Like
-признаки имеют дополнительный параметр типа +Repr
, который, я полагаю, предназначен для случаев, подобных SeqLike[Char, String]
, поэтому мы можем рассматривать String
как Seq[Char]
.
Наиболее сомнительными чертами являются Gen$Coll$
. Я не очень понимаю их смысл. В иерархии Seq
все Gen$Coll$
черты пусты до GenTraversableOnce
(также я ожидал, что GenTraversableOnce
будет назван GenTraversableOnceLike
, поскольку он обеспечивает только объявления абстрактных методов):
GenSeq <--- GenIterable <--- GenTraversable <--- GenTraversableOnce
Можете ли вы объяснить цель Gen$Coll$
черт? Пример где
Gen$Coll$
на самом деле полезно (для любых целей) будет очень признателен.