我试图了解如何在模式匹配期间将类型参数传递给类,并将其隐含在后续方法中(不是正在匹配的类的一部分),如下所示:
.class:
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)]
receive
方法中收到的消息没有类型信息。
进行模式匹配是为了获取要处理的类型(这是元组N
的列表)的消息,以便在以下表达式中使用message
。但是,在InsertQueryRequest(data)
,类型仍然不确定,这会导致错误。
也许,您可以将data
与元组类型消息一起发送。
我想知道如何在不知道元组N
的情况下插入记录db
。
我最终在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")
}
}
在我找到一个更优雅的解决方案之前,我已经走了这条路。