在此主题上有无数的问题,如果不是非常精确的措辞文章,则有无数的问题:在没有进口税的情况下重新访问隐含的内容。我已经阅读了其中的大多数,但是在不重复自己的声明的情况下隐含了默认的 CanBuildFrom
,却有问题。如果您熟悉Scala Collection库和CanBuildFrom
的分辨率,则知道对于每个Scala Collection特质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
的要求升高。
我最终得到了一层间接和我自己的 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 Collections中的所有隐含。
足够好,但是我想知道是否可以直接做。