我定义了一个类型:
UserServiceImpl.login:226
我希望迭代字段(类型和名称)。所以,我为它定义了一个LabelledGeneric和一个Keys实例。
case class Foo(bar: String)
现在我无法创建没有val labl = LabelledGeneric[Foo]
val keys = Keys[labl.Repr].apply
实例的字段。是否有其他方法可以在没有案例类实例的情况下获取字段类型信息?到目前为止,我看到的所有示例都使用了相关类型的实例,但我没有实例,只有类型。理想的是一些Foo
集合。
编辑:以前版本的问题是尝试在密钥上使用poly1但我意识到密钥没有类型信息。
答案 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))