2016-06-19 6 views
2

このトピックについては数多くの質問がありますが、あまり正確に言わない記事はRevisiting implicits without the import taxです。私はそれらのほとんどを読んだことがありますが、宣言を自分自身で繰り返すことなく、デフォルトのCanBuildFromのimplicitsを上書きすることに問題があります。スカラコレクションライブラリと解像度がCanBuildFromであれば、すべてのスカラコレクション特性CC[X]に対して、コンパニオンオブジェクトは暗黙のCanBuildFrom[CC[_], X, CC[X]]インスタンスを定義することがわかります。Scala:暗黙の優先順位を特質で宣言します

trait SpecSeq[X] extends IndexedSeq[X] 
trait MutableSeq[X] extends SpecSeq[X] 
trait ConstSeq[X] extends SpecSeq[X] 
trait ArraySeq[X] extends MutableSeq[X] 
trait ConstArray[X] extends ConstSeq[X] 

私は定義されたすべての形質のコンパニオンオブジェクトに暗黙の値を宣言避け、代わりにコンパニオンオブジェクトのための共通のベース形質にそれらを抽出することができます:私はIndexedSeq[X]から派生したクラスに根ざし、私自身のコレクションの階層を導入していますか? は私が持ってみました:

trait SpecCompanion[S[X]<:SpecSeq[X]] { 
    implicit def canBuildFrom[X] :CanBuildFrom[S[_], X, S[X]] = ??? 
} 
ArraySeq extends SpecCompanion[ArraySeq] 
ConstArray extends SpecCompanion[ConstArray] 
... 

は残念ながら、それらの定義はobject IndexedSeqで宣言されたものよりも、より具体的とは見なされません。この問題は、実際には暗黙的な単一の値ではなく、Xの要件のレベルが増加しているという事実によって、不安定になります。

答えて

0

私は間接の層とCanBuildFromの私自身のsublassになってしまった:

trait SpecCanBuildFrom[-F, -E, +T] extends CanBuildFrom[F, E, T] 

trait SpecCompanion[S[X]<:SpecSeqw[X]] { 
    implicit def cbf[X] :SpecCanBuildFrom[S[_], X, S[S]] = ??? 
} 

object SpecSeq extends SpecCompanion[SpecSeq] { 
    implicit def canBuildFrom[C[X]<:SpecSeq[X], X](implicit ev :SpecCanBuildFrom[C[_], X, C[X]) :CanBuildFrom[C[_], X, C[X]] = ev 
} 

object ArraySeq extends SpecCompanion[ArraySeq] 
object ConstArray extends SpecCompanion[ConstArray] 

今SpecSeqでの一般的な定義はScalaのコレクション内のすべての暗黙よりも優先されます。

でも十分ですが、直接行うことは可能かどうか疑問に思います。