我正在尝试理解如何在模式匹配期间将类型参数传递给类,并将其隐含在后续方法中(不是匹配的类的一部分),如下所示:
类:
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 => ?
EDIT1:
详细说明,当我在方法调用中显式调出方法中的类型时,会发生另一种类型的错误:
方法:
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)]
答案 0 :(得分:0)
在receive
方法中收到的消息没有类型信息。
执行模式匹配是为了获取您要处理的类型的消息(这是元组N
的列表),以便在以下表达式中使用message
。
但是,在InsertQueryRequest(data)
中,类型仍然不确定,导致错误。
也许,您可以发送data
以及元组类型消息。
我想知道db
如何在不知道元组N
的情况下插入记录。
答案 1 :(得分:0)
我最终在data
中匹配setScanRecords
模式,以确保传递给函数的类型/数据符合数据库插入条件。
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")
}
}
在找到更优雅的解决方案之前,我已经走了这条路。