Cómo crear un contenedor de Lista con un tipo específico
Estoy intentando crear un contenedor deList
con un tipo específico (por ejemplo,List[Int]
) tal que los métodos que toman una @ implíciCanBuildFrom
l parámetro @ devuelve una instancia de mi contenedor en lugar deList
.
Una posible solución, que parece bastante pesada, es:
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])
¿Existe una manera mejor / más fácil de crear un contenedor de este tipo o me perdí algo importante en la implementación deMyList
?
Editar Una pregunta de seguimiento es: ¿Se puede poner toda esta lógica de contenedor enListWrapper
clases o rasgos para que lo anteriorMyList
puede implementarse así:
class MyList extends ListWrapper[Int, MyList]
object MyList extends ListWrapperFactory[Int, MyList]