2016-06-19 59 views
2

关于这个话题有无数的问题,并且这里有一个相当不错的,如果不是非常精确的文章:Revisiting implicits without the import tax。我已经阅读了其中的大部分内容,但在覆盖默认的CanBuildFrom含义时没有自己重复声明的问题。如果您熟悉scala集合库并解析CanBuildFrom,则知道对于每个scala集合特征CC[X],其伴侣对象都会定义一个隐含的CanBuildFrom[CC[_], X, CC[X]]实例。我已经介绍了我自己收集层次结构,植根于从IndexedSeq[X]派生的类:斯卡拉:强化特质中隐含的优先级

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] 

我能避免所有定义特征的同伴对象声明隐含价值,而是他们解压到一个共同的基础特征的同伴对象? 我想有:

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集合所有implicits。

够好,但我想知道是否可以直接做。