Существует множество вопросов по этой теме и неплохая, если не очень точно сформулированная статья здесь: 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
.