2015-10-19 116 views
0

我试图包装一些演员接收代码在db事务来构建idempotent持久视图,通过更新数据库中的信息来处理事件。缺少参数类型扩展功能的单位斯卡拉

class TrajectoryView extends IdempotentView { 


    override def viewId: String = "trajectoryView" 

    override def persistenceId: String = "sample-id-1" 

    override def handleEvent(event: Event): Unit = { 
     case ProcessDetectedEvent(time, processData, id, activityType) => 
     val coords = Db.save(processData.coordinates) 
     Db.save(CoordinatesWrapper(id, coords)) 

     case ProcessUpdatedEvent(id, processData, time) => 
     val coords = Db.save(processData.coordinates) 
     Db.save(CoordinatesWrapper(id, coords)) 
    } 
} 

abstract class IdempotentView extends PersistentView { 

    def handleEvent(event: Event): Unit = ??? 
    var maxSeenSeqNumber = Db.query[SeqNumberWrapper].fetchOne().getOrElse(SeqNumberWrapper(0, viewId)).seqNumber 

    def receive: Receive = { 
    case event: Event => 
     if (lastSequenceNr > maxSeenSeqNumber) { 
     Db.transaction { 
      Db.save(SeqNumberWrapper(lastSequenceNr, viewId)) 
      handleEvent(event) 
     } 
     } 

    case _: Unit => 
     println("Unknown message") 
    } 
} 



Error:(22, 50) missing parameter type for expanded function The argument types of an anonymous function must be fully known. (SLS 8.5) 

Expected type was: Unit override def handleEvent(event: Event): Unit = { 

我该怎么办?我不明白这个错误究竟意味着什么。从我的观点来看,我编写了所有类型,编译器不需要推断任何内容。

回答

4

选择的

override def handleEvent: Event => Unit = { 
... 
} 

override def handleEvent(event: Event): Unit = event match { 
... 
} 

如果更精确的代码中括号是适合定义PartialFunction[T,Unit]这是转换为Unit之一。所以一般来说你的代码是正确的,但编译器不能推断类型T并抱怨它。但如果它可能会导致一个函数返回另一个函数,而不是你所期望的。

+0

它的工作原理!非常感谢!如果没有你的帮助,我会花一整天阅读scala文档来解决这个问题。 – user1685095

+0

那么为什么这个问题没有标记为“已回答”? – jwvh