사용자 정의 Seq
작업 다음 사항을 고려하십시오스칼라에서 바운드 형식 매개 변수를 사용하여 사용자 지정 Seq를 만드는 방법은 무엇입니까?
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))
}
가 나는이 형식 매개 변수 B
에 바인딩 부과하고 싶습니다. 즉,이 같은 (작동하지 않는) 좋아하는 것 :
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))
}
을하지만 난 표시 줄에 다음과 같은 유형의 불일치 오류를 얻을 : 나는이 문제를 해결하기 위해 노력했다
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
CanBuildFrom 및 newBuilder의 형식 매개 변수에 경계를 추가하지만 다른 오류 메시지가 나타납니다.
유형 매개 변수가 바인딩 된 맞춤 Seq
을 어떻게 만듭니 까?
당신이 후 오히려 컬렉션을 확장 상한 요구 사항 래퍼 클래스에서 캡슐화하고 어떤 이유는 여기에
–이유는 더 우아 할 것입니다. 이 클래스에서는'map'과'filter'를 많이 사용하게 될 것이고, 매번 수동으로 unwrap하고 re-wrap하는 것은 불편할 것입니다. – Bruno