我在我的数据库层中使用Generic将案例类的实例转换为JDBC投诉类型的List[Any]
。因此,我有以下模式一直重复
val genSignal = LabelledGeneric[Signal]
genSignal.to(item).values.map(toSqlTypedHlist).toList
IntelliJ提示values
是未知字段,但它会编译。所以我决定写下面的方法
private def getSqlValuesFromCaseClass[T <: AnyRef : Generic](item : T) : Seq[Any] = {
val generic: Generic[T] = implicitly[Generic[T]]
generic.to(item).values.map(toSqlTypedHlist).toList
}
其中toSqlTypedHlist
是
private object toSqlTypedHlist extends Poly1 {
implicit def atAnything[T: SqlTyped] = at[T](_.toSqlType)
}
但无法编译说
Error:(730, 22) value values is not a member of generic.Repr
generic.to(item).values.map(toSqlTypedHlist).toList
^
我在这里缺少什么?
UPD:我按照Miles的建议更新了功能,但没有帮助
private def getSqlValuesFromCaseClass[T <: AnyRef : Generic](item : T) : Seq[Any] = {
val generic: Generic[T] = implicitly[Generic[T]]
generic.to(item).map(toSqlTypedHlist).toList
}
我收到以下错误
Error:(73, 22) value map is not a member of generic.Repr
generic.to(item).map(toSqlTypedHlist).toList
^
答案 0 :(得分:1)
尝试一下
的内容import shapeless.ops.hlist.Mapper
private def getSqlValuesFromCaseClass[T, R <: HList](item: T)
(implicit
gen: Generic.Aux[T, R],
mpr: Mapper[toSqlTypedHlist.type, R]
): Seq[Any] = {
gen.to(item).map(toSqlTypedHlist).runtimeList
}
您缺少的是Mapper
实例(由HList
代表类型R
和Poly
的单例类型编制索引。)
请注意runtimeList
的使用会因Seq[Any]
的结果类型签名的要求而失去所有精度,但这并不是无形的惯用...通常我希望查看映射元素的精确类型计算或某种折叠。