Извини, мой плохой, тогда.
аюсь создать обёрткуList
с конкретным типом (например,List[Int]
) такие, что методы, которые принимают неявноеCanBuildFrom
параметр возвращает экземпляр моей обертки вместоList
.
Одним из возможных решений, которое кажется довольно тяжелым, является:
import scala.collection._
import generic.{CanBuildFrom, SeqForwarder}
import mutable.{Builder, ListBuffer}
class MyList(list: List[Int]) extends immutable.LinearSeq[Int]
with LinearSeqLike[Int, MyList]
with SeqForwarder[Int] {
override def newBuilder: Builder[Int, MyList] = MyList.newBuilder
protected override def underlying = list
}
object MyList {
def newBuilder: Builder[Int, MyList] =
new ListBuffer[Int] mapResult(new MyList(_))
implicit def canBuildFrom: CanBuildFrom[MyList, Int, MyList] = {
new CanBuildFrom[MyList, Int, MyList] {
def apply(from: MyList) = from.newBuilder
def apply() = newBuilder
}
}
}
val l1 = new MyList(List(1,2,3))
println(l1.isInstanceOf[MyList])
println(l1.map(_ + 1).isInstanceOf[MyList])
println(l1.filter(_ == 2).isInstanceOf[MyList])
Есть ли лучший / более простой способ создать такую обертку, или я упустил что-то важное в реализацииMyList
?
Редактировать: Последующий вопрос: можно ли поместить всю эту логику обертки вListWrapper
классы или черты, так что вышеMyList
может быть реализовано так:
class MyList extends ListWrapper[Int, MyList]
object MyList extends ListWrapperFactory[Int, MyList]