关于这个话题有无数的问题,并且这里有一个相当不错的,如果不是非常精确的文章: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
的要求水平不断提高而加剧的。