在 groovy 中可以这样做:
class Foo {
Integer a,b
}
Map map = [a:1,b:2]
def foo = new Foo(map) // map expanded, object created
我知道 Scala 在任何意义上都不是 Groovy,但我想知道在这种情况下是否支持地图扩展
简单地说,我尝试并失败了:
case class Foo(a:Int, b:Int)
val map = Map("a"-> 1, "b"-> 2)
Foo(map: _*) // no dice, always applied to first property
显示问题可能解决方案的相关线程。
现在,据我所知,至少从 Scala 2.9.1 开始,关于案例类的反射基本上是无操作的。最终的结果似乎是一个人被迫进行某种形式的手动对象创建,考虑到 Scala 的强大功能,这有点讽刺。
我应该提到,用例涉及到 servlet 请求参数映射。具体来说,使用 Lift、Play、Spray、Scalatra 等,我想获取经过清理的参数映射(通过路由层过滤)并将其绑定到目标案例类实例,而无需手动创建对象,也无需指定其类型. 这将需要“可靠的”反射和“str2Date”之类的隐式来处理类型转换错误。
也许在带有新反射库的 2.10 中,实现上述内容将是小菜一碟。进入 Scala 才 2 个月,所以只是触及表面;我现在没有看到任何直接的方法来实现这一点(对于经验丰富的 Scala 开发人员来说,也许是可行的)