Scala 如何定义“通用参数”;在飞行中;?
如何定义通用参数“动态”?Scala 如何定义“通用参数”;在飞行中;?,scala,generics,Scala,Generics,如何定义通用参数“动态”? 示例: 我有一些方法def get[T](名称: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
示例:
我有一些方法
def get[T](名称: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)}
有什么方法可以这样做吗?正如它在对您的问题的评论中所说的那样-不可能在编译时从对象的运行时反射中提取类型-因此您失去了所有类型检查(并且可能必须在某个地方执行
的安装)
但是,根据您的需要,您可以选择一些类型安全的替代方案,比如使用,它也可以允许您按名称访问字段,但使用类型安全的方式。因此,只有HList[String::String::Option[Int]]
(其中存储了所有字段类型),而不是List[Method]
您还可以轻松地将记录转换为case类:User(userRecord(“name”)、userRecord(“passbrow”)、userRecord(“age”)
。但这都需要可能的字段名(“name”、“password”等)应该在编译时知道。我不太明白。如果使用运行时反射调用方法,则不需要提供泛型类型-泛型在运行时被删除。泛型是纯编译时构造,它们提供类型安全性。您所做的操作本质上是不安全的,需要显式转换。泛型e没有用。