0

我正在尝试使用scala-cass来读取 cassandra 并将结果集转换为使用resultSet.as[CaseClass]. 这在运行以下命令时效果很好。

import com.weather.scalacass.syntax._    
case class TestTable(id: String, data1: Int, data2: Long)
val resultSet = session.execute(s"select * from test.testTable limit 10")
resultSet.one.as[TestTable]

现在我试图使它更通用,但我无法为泛型类找到合适的类型约束。

import com.weather.scalacass.syntax._    
case class TestTable(id: String, data1: Int, data2: Long)

abstract class GenericReader[T] {
  val table: String
  val keyspace: String

  def getRows(session: Session): T = {
    val resultSet = session.execute(s"select * from $keyspace.$table limit 10")
    resultSet.one.as[T]
  }
}

我用所需的案例类实现这个类,并尝试在创建的对象上调用 getRows。

object TestTable extends GenericReader[TestTable] {
  val keyspace = "test"
  val table = "TestTable"
}

TestTable.getRows(session)

这会引发异常could not find implicit value for parameter ccd: com.weather.scalacass.CCCassFormatDecoder[T]

我正在尝试向 GenericReader 添加类型约束,以确保隐式转换能够正常工作。但是,我找不到合适的类型。我正在尝试通读 scala-cass 以找到适当的约束,但到目前为止我还没有运气。

我也很乐意使用任何其他可以实现这一目标的库。

4

2 回答 2

2

看起来as[T]需要一个您在范围内没有的隐式值,因此您还需要在getRows方法中要求该隐式参数。

def getRows(session: Session)(implicit cfd: CCCassFormatDecoder[T]): T

您可以使用context bounds将其表示为类型约束(您在原始问题中寻找的内容):

abstract class GenericReader[T:CCCassFormatDecoder]
于 2017-06-26T18:04:08.393 回答
0

与其尝试绑定您的泛型类型,不如T只传递缺少的隐式参数可能更容易:

abstract class GenericReader[T](implicit ccd: CCCassFormatDecoder[T]) {
  val table: String
  val keyspace: String

  def getRows(session: Session): T = {
    val resultSet = session.execute(s"select * from $keyspace.$table limit 10")
    resultSet.one.as[T]
  }
}

T当您将其缩小到特定类(如object TestTable extends GenericReader[TestTable])时,可以推迟为该隐式找到一个具体值

于 2017-06-26T17:56:01.170 回答