我正在尝试使用 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 以找到适当的约束,但到目前为止我没有运气。
我也很乐意使用任何其他可以实现此目的的库。
看起来as[T]
需要一个你在作用域中没有的隐式值,所以你还需要在getRows
方法中要求该隐式参数。
def getRows(session: Session)(implicit cfd: CCCassFormatDecoder[T]): T
您可以使用上下文边界将其表示为类型约束(您在原始问题中查找的内容):
abstract class GenericReader[T:CCCassFormatDecoder]
与其尝试绑定泛型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]
)时,可以推迟到为该隐式查找具体值