如何定义通用参数"动态"?
例如:
我有一些方法def get[T](name: String)
简单案例类
case class User(name: String, password: String, age: Option[Int])
然后我得到了我的所有案例访问者
def getMethods[T: TypeTag] = typeOf[T].decls.sorted.collect {
case m: MethodSymbol if m.isCaseAccessor => m
}.toList
val caseAccessors = getMethods[User]
我需要使用每个访问器方法调用get
方法,并通过accessorMethod返回类型
例如:
caseAccessors.map{accessorMehtod => get[accessorMehtod.returnType](accessorMehtod.name)}
有什么办法吗?
答案 0 :(得分:0)
正如你在对你的问题的评论中所说的那样 - 在编译时不可能从运行时提取类型的对象中提取类型 - 所以你放弃了所有的类型检查(可能必须在某处做asInstanceOf
) 。
但是,取决于您的需求 - 您可以选择一些类型安全的替代方案,例如使用Shapeless Records,这也可以允许您按名称访问字段,但是以类型安全的方式。因此,只有HList[String :: String :: Option[Int]]
(其中存储所有字段类型)而不是List[Method]
。
您还可以轻松地将记录转换为案例类:User(userRecord("name"), userRecord("passsword"),userRecord("age")
。但这一切都要求在编译时应该知道可能的字段名称(“名称”,“密码”等)。