无法为shapless Generic编写泛型函数

时间:2016-01-21 22:52:52

标签: scala generics shapeless

我在我的数据库层中使用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
                     ^

1 个答案:

答案 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代表类型RPoly的单例类型编制索引。)

请注意runtimeList的使用会因Seq[Any]的结果类型签名的要求而失去所有精度,但这并不是无形的惯用...通常我希望查看映射元素的精确类型计算或某种折叠。