Considérez ce qui suit travail sur mesure Seq
:Comment créer un Seq personnalisé avec un paramètre de type bounded dans Scala?
class MySeq[B](val s: Seq[B])
extends Seq[B]
with GenericTraversableTemplate[B, MySeq]
with SeqLike[B, MySeq[B]] {
override def companion = MySeq
def iterator = s.iterator
def apply(i: Int) = s(i)
def length = s.length
override def toString = s map { _.toString } mkString("\n")
}
object MySeq extends SeqFactory[MySeq] {
implicit def canBuildFrom[B]: CanBuildFrom[Coll, B, MySeq[B]] =
new GenericCanBuildFrom[B]
def newBuilder[B] = new ListBuffer[B] mapResult (x => new MySeq(x.toSeq))
}
je voudrais imposer une limite sur le paramètre de type B
. En d'autres termes, je voudrais quelque chose comme ça (ne fonctionne pas):
class MyA
class MySeq[+B <: MyA](val s: Seq[B])
extends Seq[B]
with GenericTraversableTemplate[B, MySeq]
with SeqLike[B, MySeq[B]] {
override def companion = MySeq // Type Mismatch Here
def iterator = s.iterator
def apply(i: Int) = s(i)
def length = s.length
override def toString = s map { _.toString } mkString("\n")
}
object MySeq extends SeqFactory[MySeq] {
implicit def canBuildFrom[B]: CanBuildFrom[Coll, B, MySeq[B]] =
new GenericCanBuildFrom[B]
// Type Mismatch in the line below
def newBuilder[B] = new ListBuffer[B] mapResult (x => new MySeq(x.toSeq))
}
mais je reçois les erreurs d'incompatibilité de type suivantes dans les lignes indiquées:
inferred type arguments [B] do not conform to
class MySeq's type parameter bounds [+B <: MyA]
Main.scala line 49
type mismatch;
found : countvotes.structures.MySeq.type
required: scala.collection.generic.GenericCompanion[Seq]
Main.scala line 36
type mismatch;
found : MySeq[B(in class MySeq)]
required: MySeq[B(in method newBuilder)]
Main.scala line 49
type mismatch;
found : scala.collection.immutable.Seq[B(in method newBuilder)]
required: Seq[B(in class MySeq)]
Main.scala line 49
J'ai essayé de résoudre ce problème en ajouter des bornes aux paramètres de type de CanBuildFrom et newBuilder, mais j'obtiens ensuite d'autres messages d'erreur.
Comment créer un Seq
personnalisé avec un paramètre de type lié?
Toute raison pour laquelle vous l'extension de la collection plutôt que l'encapsuler dans une classe d'emballage à l'exigence limite supérieure ? –
La raison en est que ce serait plus élégant. J'utiliserai souvent 'map' et' filter' sur cette classe, et il serait peu pratique de déballer et de ré-emballer manuellement à chaque fois. – Bruno