Scala:强制在trait中声明的隐式
关于这个主题有无数的问题,这里有一篇非常好的文章,如果不是非常精确的话:。我已经阅读了其中的大部分内容,但是在重写默认的Scala:强制在trait中声明的隐式,scala,scala-collections,scala-implicits,Scala,Scala Collections,Scala Implicits,关于这个主题有无数的问题,这里有一篇非常好的文章,如果不是非常精确的话:。我已经阅读了其中的大部分内容,但是在重写默认的CanBuildFromimplicits时遇到了一个问题,我自己也没有重复声明。如果您熟悉scala集合库和CanBuildFrom的解析,您就会知道,对于每个scala集合特征CC[X],它的伴生对象都定义了一个隐式的CanBuildFrom[CC[\uuz],X,CC[X]实例。我已经介绍了自己的集合层次结构,它植根于从IndexedSeq[X]派生的类中: trait
CanBuildFrom
implicits时遇到了一个问题,我自己也没有重复声明。如果您熟悉scala集合库和CanBuildFrom
的解析,您就会知道,对于每个scala集合特征CC[X]
,它的伴生对象都定义了一个隐式的CanBuildFrom[CC[\uuz],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]
...
trait SpecCompanion[S[X]我最终得到了一层间接寻址和我自己的子类CanBuildFrom
:
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]
trait SpecCanBuildFrom[-F,-E,+T]扩展了CanBuildFrom[F,E,T]
特征参数[S[X]