Scala 泛型类型作为类参数和匹配(&Slick)



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

.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

我最终在setScanRecordsdata模式匹配,以确保传递给函数的类型/数据符合数据库插入条件。

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")
      }
    }

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

最新更新