Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:强制在trait中声明的隐式_Scala_Scala Collections_Scala Implicits - Fatal编程技术网

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]