我正在尝试使用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]
}
}
我使用所需的case类实现此类,并尝试在创建的Object上调用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阅读以找到适当的约束,但到目前为止我没有运气。
我也很乐意使用任何其他可以实现此目的的库。
答案 0 :(得分:2)
看起来as[T]
需要您在范围内没有的隐式值,因此您还需要在getRows
方法中要求隐含参数。
def getRows(session: Session)(implicit cfd: CCCassFormatDecoder[T]): T
您可以使用context bounds将此表达为类型约束(您在原始问题中寻找的内容):
abstract class GenericReader[T:CCCassFormatDecoder]
答案 1 :(得分: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]
)