使用给定类型的字段迭代键

时间:2015-12-07 05:36:26

标签: scala shapeless

我定义了一个类型:

UserServiceImpl.login:226

我希望迭代字段(类型和名称)。所以,我为它定义了一个LabelledGeneric和一个Keys实例。

case class Foo(bar: String)

现在我无法创建没有val labl = LabelledGeneric[Foo] val keys = Keys[labl.Repr].apply 实例的字段。是否有其他方法可以在没有案例类实例的情况下获取字段类型信息?到目前为止,我看到的所有示例都使用了相关类型的实例,但我没有实例,只有类型。理想的是一些Foo集合。

编辑:以前版本的问题是尝试在密钥上使用poly1但我意识到密钥没有类型信息。

1 个答案:

答案 0 :(得分:3)

Fields扩展了DepFn1,因此在apply方法中需要一个参数。

但是,您可以调整其定义以收集Repr的ClassTag:

trait FieldTags[L <: HList] extends DepFn0 with Serializable {
  type Out = List[(Symbol, ClassTag[_])]
}

object FieldTags {
  def apply[L <: HList](implicit fields: FieldTags[L]): FieldTags[L] = fields

  implicit def hnilFields[L <: HNil]: FieldTags[L] = 
    new FieldTags[L] { def apply() = List.empty }

  implicit def hconsFields[K <: Symbol, V, T <: HList](implicit
                                                    key: Witness.Aux[K],
                                                    tailFields: FieldTags[T],
                                                    tag: ClassTag[V])
  : FieldTags[FieldType[K, V] :: T] = new FieldTags[FieldType[K, V] :: T] {
    def apply() = (key.value -> tag) :: tailFields.apply()
  }
}

val fields: List[(Symbol, ClassTag[_])] = FieldTags[labl.Repr].apply()
println(fields)
// List(('br, java.lang.String))