2016-06-19 13 views
2

Существует множество вопросов по этой теме и неплохая, если не очень точно сформулированная статья здесь: Revisiting implicits without the import tax. Я прочитал большинство из них, но у меня проблема с переопределением значений по умолчанию CanBuildFrom, не повторяя сами декларации. Если вы знакомы с библиотекой коллекций scala и разрешением CanBuildFrom, вы знаете, что для каждого объекта коллекции scala CC[X] его сопутствующий объект определяет неявный CanBuildFrom[CC[_], X, CC[X]] экземпляр. Я ввел свою собственную иерархию сбора, укорененный в классе, производном от IndexedSeq[X]:Scala: соблюдение приоритета неявного объявления в признаке

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

Я закончил с слоем косвенностью и моей sublass из 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] 

Теперь общее определение в SpecSeq перекрывает все implicits в коллекциях SCALA.

Хорошо, но мне интересно, можно ли это сделать напрямую.