Насколько я знаю из прочтения этой статьи:
http://www.scala -lang.org / доку / файлы / сборники-апи / коллекции-impl.html
ваше решение самое простое, если вам нужен фильтр / карта / и т.д. для всех возвращаемых экземпляров MyList
. newBuilder
необходим для операций типа filter
, а неявный CanBuildFrom
для операций типа map
, что может изменить тип коллекции.
Что вы, возможно, должны сделать в своем CanBuildFrom
, это:
def apply(from: MyList) = from.newBuilder // call it on `from'
, который гарантирует, что map
для статически типизированного MyList
, который на самом деле имеет динамический тип, который является подтипом MyList
, будет повторно использовать этот же динамический тип.
Редактировать : кажется, что чего-то не хватает, для этого map
возвращает экземпляр List
, а не MyList
:
val l1: LinearSeq[Int] = new MyList(List(1, 2, 3))
println(l1.map(_ + 1)) // prints List(2, 3, 4)
похоже, что это также относится к примеру RNA
, взятому из связанной статьи. Если он имеет статический тип IndexedSeq[Base]
вместо RNA
, map
возвращает вектор.
Редактировать 2 : похоже, это более общая проблема, обсуждаемая в в этом вопросе .