У меня есть поток akka, где у меня есть ADT формы.
sealed trait Message
sealed trait ThisMessage extends Message
sealed trait ThatMessage extends Message
Теперь у меня есть поток обработчиков сообщений и поток обработчиков сообщений. У меня есть входной поток, который принимает тип сообщения.
Чтобы создать разделение, у меня есть следующий разделитель. У меня есть следующее определение для функции разделителя.
/**
* Creates a Partition stage that, given a type A, makes a decision to whether to partition to subtype B or subtype C
*
* @tparam A type of input
* @tparam B type of output on the first outlet.
* @tparam C type of output on the second outlet.
*
* @return A partition stage
*/
def binaryPartitionByType[A, B <: A, C <: A](): Graph[FanOutShape2[A, B, C], NotUsed] =
GraphDSL.create[FanOutShape2[A, B, C]]() { implicit builder =>
import GraphDSL.Implicits._
// This is wrong, but I have no idea how to write this.
val partitioner: UniformFanOutShape[A, A] = builder.add(Partition[A](2, {
case _: B => 0
case _: C => 1
}))
new FanOutShape2(partitioner.in, partitioner.out(0).outlet, partitioner.out(1).outlet)
}
Я хочу использовать описанный выше метод и использовать ADT в параметрах типа для инициализации разделителя.
Компилятор выдает эту ошибку.
Error:(63, 7) type mismatch;
found : akka.stream.FanOutShape2[A,A,A]
required: akka.stream.FanOutShape2[A,B,C]
new FanOutShape2(partitioner.in, partitioner.out(0).outlet,
partitioner.out(1).outlet)
Из того, что я понимаю, объект раздела имеет только вход (в данном случае A, параметризованный тип.
У кого-нибудь есть идеи, как я могу это исправить?