2017-04-21 8 views
1

私はStringList[_]の両方で機能する特性を持ちたいと思っています。それは次のとおりです。文字列とリストを扱う特性を持つ方法は?

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 
} 

答えて

1

クイック答えは、あなたがabab.endsWith(b.seq)abab.startsWith(b.seq)よう.seqを使用する必要があります。

関連する問題