我在使用数据流时遇到了问题。如果我在 maven scala 插件配置中启用延续,maven 无法编译。
在我启用 maven 中的延续后,编译开始失败。并且错误信息非常混乱。
像这样:
发现:单位@scala.util.continuations.cpsSynth @util.continuations.cps[scala.concurrent.Future[Any]]
要求:单位
或这个:
找到 : ((Class[_ <: Indexed[String]], scala.concurrent.Promise[List[_ <: Indexed[String]]])) => (Class[ $1(in value $anonfun)], List[ <: Indexed[String]]) @scala.util.continuations.cpsSynth @util.continuations.cps[scala.concurrent.Future[Any]] forSome { type _$1(in value $anonfun) <: Indexed[String] }
必需: ((Class[_ <: Indexed[String]], scala.concurrent.Promise[List[_ <: Indexed[String]]])) => B
所有这些错误都发生在关闭时。似乎闭包不能在流上下文中使用。
有谁知道为什么?
错误代码:
def toList[T <: Indexed[String]](content: Iterable[String], klass: Class[T]) = {
val ref = new TypeReference[List[T]] {}
content.flatMap(JsonUtils.toObject(_, ref)).toList
}
flow {
val objects = toList(content, klass)
val hasRefs = klass.getFields.filter(it => it.getAnnotation(classOf[Ref]) != null)
hasRefs.foreach {injectRef(_, objects)}
promise << objects
}
def injectRef[T <: Indexed[String]](field: Field, objects: List[T]) {
val anno = field.getAnnotation(classOf[Ref])
val refKlass = anno.klass()
def setField(o: T) {
val original = field.isAccessible
field.setAccessible(true)
val f = field.get(o)
val found = promises.get(refKlass)().find(it => it.index() == f)
field.set(o, found)
field.setAccessible(original)
}
objects.foreach { o =>
setField(o) // here, compile error
}
}