【问题标题】:Scala Generic Type as Class Parameter and matching (& Slick)Scala 通用类型作为类参数和匹配 (& Slick)
【发布时间】:2014-01-01 22:37:12
【问题描述】:

我正在尝试了解如何在模式匹配期间将类型参数传递给类,并将其隐含在后续方法中(不是匹配的类的一部分),如下所示:

类:

case class QueryRequest[A](data: List[A])

模式匹配:

def receive = {

    case QueryRequest(data) => sender ! QueryResponse(setScanRecords(data))
...
}

方法:

 def setScanRecords[A](data: List[A]) = 
     db withTransaction { data foreach ScanRecords.insert }

类型A将是一个变量组合的元组,例如:

(String, String, Long)

(String, String, String, String)

等等

最好的方法是什么?目前setScanRecords 抛出如下异常:

type mismatch; found : [TT](query: scala.slick.lifted.Query[TT,(String, String, Long)])(implicit session: scala.slick.session.Session)Int <and> (value: (String, String, Long))(implicit session: scala.slick.session.Session)Int required: A => ?

编辑1:

详细来说,当我在方法调用中显式调出方法中的类型时,会出现另一种错误:

方法:

def setScanRecords(data: List[(String, String, Long)]) = 
     db withTransaction { data foreach ScanRecords.insert }

错误:

case QueryRequest(data) => sender ! QueryResponse(setScanRecords(data))

type mismatch; found : Any required: List[(String, String, Long)]

【问题讨论】:

  • 除了QueryRequest 的一个类型参数和setScanRecords 的一个类型参数,您可以通过将其移至封闭类/特征来分解它吗?你可以让你的actor类通用吗?
  • InsertQueryRequest 是如何定义的?喜欢QueryRequest
  • @Qerub,复制/粘贴/简化错误。我已经在上面更正了。 InsertQueryRequest = QueryRequest.

标签: scala akka slick


【解决方案1】:

receive 方法中收到的消息没有类型信息。

进行模式匹配是为了得到你想要处理的类型的消息(这是一个TupleN的列表),以便在下面的表达式中使用message。 但是在InsertQueryRequest(data)中,类型仍然不确定,导致错误。

也许,您可以将data 与元组类型消息一起发送。

我想知道db 如何在不知道元组N 的情况下插入记录。

【讨论】:

    【解决方案2】:

    我最终在setScanRecords 中匹配data,以确保传递给函数的类型/数据符合数据库插入标准。

    def setScanRecords[A](data: List[A]) =
        db withTransaction {
          data foreach {
            case (a: String, b: String, c: Long) => ScanRecords.insert(a, b, c)
            case s => throw new Exception(s"Expected (String, String, Long) but found something else: $s")
          }
        }
    

    在找到更优雅的解决方案之前,我一直走这条路。

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2014-07-01
      • 2011-08-25
      相关资源
      最近更新 更多