このトピックについては数多くの質問がありますが、あまり正確に言わない記事は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
の要件のレベルが増加しているという事実によって、不安定になります。