1
私はString
とList[_]
の両方で機能する特性を持ちたいと思っています。それは次のとおりです。文字列とリストを扱う特性を持つ方法は?
trait Mixer[A] {
def mix(a: A, b: A): A = b ++ a ++ b
def isMix(abab: A, b: A) =
abab.endsWith(b) && abab.startsWith(b) && abab.length > 2*b.length
}
object MixerString extends Mixer[String]
object MixerListInt extends Mixer[List[Int]]
失敗したそれはと方法isMix
に文句を言い
trait Mixer[C, A] {
implicit def toSeqLike(in: A): collection.SeqLike[C, A]
implicit val bf: collection.generic.CanBuildFrom[A, C, A]
def mix(a: A, b: A): A = b ++ a ++ b
def isMix(abab: A, b: A) =
abab.endsWith(b) && abab.startsWith(b) && abab.length > 2*b.length
}
:
はどちらか私はどのように解決するのです
error: type mismatch;
found : A
required: scala.collection.GenSeq[?]
> abab.endsWith(b) && abab.startsWith(b) && abab.length > b.length
> ^
質問この最後のエラー、または私は何かをもっと簡単にすることができますか?
編集:完全なソリューション(感謝@Frederico)
import collection.generic.CanBuildFrom
import collection.SeqLike
trait Mixer[C, A] {
implicit def toSeqLike(in: A): SeqLike[C, A]
implicit val bf: CanBuildFrom[A, C, A]
def mix(a: A, b: A): A = b ++ a ++ b
def isMix(abab: A, b: A) =
abab.endsWith(b.seq) && abab.startsWith(b.seq) && abab.length > 2*b.length
}
object MixerString extends Mixer[Char, String] {
val bf = implicitly[CanBuildFrom[String,Char,String]]
def toSeqLike(in: String): SeqLike[Char,String] = in
}
object MixerListInt extends Mixer[Int, List[Int]] {
val bf = implicitly[CanBuildFrom[List[Int],Int,List[Int]]]
def toSeqLike(in: List[Int]): SeqLike[Int,List[Int]] = in
}