未指定的值参数rconv

时间:2016-10-12 23:09:00

标签: scala slick

我的代码中有这些行

val x = database.withSession { implicit session => 
  StaticQuery.queryNA[Long](s"select id from .....")
}

val y = database.withSession { implicit session => 
  StaticQuery.queryNA[Long](s"select id1 from .....")
}

val z = database.withSession { implicit session => 
  StaticQuery.queryNA[(Long, Long)](s"select id1, id2 from .....")
}

为了最大限度地减少代码重复,我将代码更改为

def genericExec[T](query: String) : List[T] = {
  database.withSession { implicit session => 
    StaticQuery.queryNA[T](query).list
  }
}

for {
  x <- genericExec[Long](query1)
  y <- genericExec[Long](query2)
  z <- genericExec[(Long, Long)](query3)
} {...}

当然我现在收到错误

Error:(16, 32) not enough arguments for method queryNA: (implicit rconv: scala.slick.jdbc.GetResult[T])scala.slick.jdbc.StaticQuery[Unit,T].
Unspecified value parameter rconv.
         StaticQuery.queryNA[T](query).list

由于T类型是完全通用的,因此我无法提供所有类型的转换。那么我怎样才能保持我的通用实现,只提供我的类型T在我的代码中实际使用的转换(又名Long,以及(长,长)

1 个答案:

答案 0 :(得分:0)

由于queryNAGetResult上有T约束,因此您的函数必须具有相同的约束。您需要告诉您的通用方法,它仅对定义了T的类型GetResult有效,因此:

def genericExec[T : GetResult](query: String) : List[T] = ...

或等效地:

def genericExec[T](query: String)(implicit rconv: GetResult[T]) : List[T] = ...