Как мне определить неявный класс, который может объединять как базовый, так и производный класс?
Я хочу реализовать класс, который бы объединял Flow и Source .Я попробовал это
implicit class FlowOpsMatExt[T, Mat](val flow: FlowOpsMat[T, Mat]) {
def groupSortedByKey[K](keyForItem: T ⇒ K, maxBufferSize: Int): flow.Repr[Vector[T]]
}
Но вызвал экземпляр Source[]
Я получил FlowOpsMat
, который я больше не могу использовать в качестве источника.Поэтому я попытался обмануть его
implicit class FlowOpsMatExt[T, Mat, C <: FlowOpsMat[T, Mat]](val flow2: C)
, но он по какой-то причине не может определить типы.При явном вызове
new FlowOpsMatExt(source_instance)
я получаю следующую ошибку
Error:(106, 5) inferred type arguments [Nothing,Nothing,akka.stream.scaladsl.Source[akka.util.ByteString,akka.NotUsed]] do not conform to class FlowOpsMatExt's type parameter bounds [T,Mat,C <: akka.stream.scaladsl.FlowOpsMat[T,Mat]]
new FlowOpsMatExt(src)
Минимальный воспроизводимый пример: https://gist.github.com/931a313546f14e809b705e86743dcdb0
Компилируется, если я явно указываю все типы new FlowOpsMatExt[ByteString, NotUsed, Source[ByteString, NotUsed]](src)
но это убивает выгоду от использования неявного класса.
Чего мне не хватает?
Лучшее, что я могу придумать, - это сохранить реализацию функции расширения в абстрактном классе и реализовать из нее два неявных класса.
abstract class FlowOpsMatExt[T, Mat, C <: FlowOpsMat[T, Mat]] {
protected val flow: C
}
implicit class FlowExt2[In, Out, Mat](val flow: Flow[In, Out, Mat]) extends FlowOpsMatExt[Out, Mat, Flow[In, Out, Mat]] {
}
implicit class SourceExt[T, Mat](val flow: Source[T, Mat]) extends FlowOpsMatExt[T, Mat, Source[T, Mat]] {
}