我正在尝试撰写Enumeratee.grouped
和Enumeratee.filter
来制作新的枚举,但我遇到了差异问题。我的枚举器的输入和输出类型是ADT,我得到以下错误。
<console>:24: error: type mismatch;
found : play.api.libs.iteratee.Enumeratee[OutputType,OutputType]
required: play.api.libs.iteratee.Enumeratee[Product with Serializable with OutputType,OutputType]
Note: OutputType >: Product with Serializable with OutputType, but trait Enumeratee is invariant in type From.
You may wish to define From as -From instead. (SLS 4.5)
我已在此处使用较小的示例重新创建了我的问题(我知道此示例可以重写为Enumeratee.collect
但是,除非有办法合并Enumeratee.grouped
和Enumeratee.filter
这个不会帮助我。)
import play.api.libs.iteratee.Enumeratee
import scala.concurrent.ExecutionContext.Implicits.global
sealed abstract class InputType
case class InputA(counter: Int) extends InputType
case object InputB extends InputType
sealed abstract class OutputType
case class OutputA(msg: String) extends OutputType
case object OutputB extends OutputType
val e: Enumeratee[InputType, OutputType] = Enumeratee.map[InputType] {
case InputA(counter) => OutputA(counter.toString)
case InputB => OutputB
} compose Enumeratee.filter[OutputType] {
case OutputA("4") => false
case _ => true
}
我无法将Enumeratee上的From
类型重新定义为编译器错误建议的-From
,因为它是一个播放库。在编写枚举数时,您是否无法使用ADT限制库?或者这个用例是否有更好的方法(在某处放置ClassTag
,用另一种方式写这个功能等等)?
答案 0 :(得分:0)
我找到了一个似乎没问题的解决方案。如果您将Enumeratee.map[InputType]
更改为Enumeratee.map[InputType].apply[OutputType]
,则推理器将获得不变类型,并且编译得很好。
val e: Enumeratee[InputType, OutputType] = Enumeratee.map[InputType].apply[OutputType] {
case InputA(counter) => OutputA(counter.toString)
case InputB => OutputB
}