我如何定义通用参数"在飞行中"?

时间:2015-01-11 13:26:34

标签: scala generics

如何定义通用参数"动态"? 例如:
我有一些方法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)}

有什么办法吗?

1 个答案:

答案 0 :(得分:0)

正如你在对你的问题的评论中所说的那样 - 在编译时不可能从运行时提取类型的对象中提取类型 - 所以你放弃了所有的类型检查(可能必须在某处做asInstanceOf) 。

但是,取决于您的需求 - 您可以选择一些类型安全的替代方案,例如使用Shapeless Records,这也可以允许您按名称访问字段,但是以类型安全的方式。因此,只有HList[String :: String :: Option[Int]](其中存储所有字段类型)而不是List[Method]

您还可以轻松地将记录转换为案例类:User(userRecord("name"), userRecord("passsword"),userRecord("age")。但这一切都要求在编译时应该知道可能的字段名称(“名称”,“密码”等)。