Scala Generic Type作为类参数和匹配(& Slick)

时间:2014-01-01 22:37:13

标签: scala akka slick

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

类:

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)]

2 个答案:

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

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