我正在开发一个mapper,想要一种类型安全的方法来捕获用于映射的类字段名,并使用我在C#中使用的语法:
case class Person(name: String, age: Int)
new Mapping[Person]() {
field(_.age).name("person_age").colType[java.lang.Integer]
field(_.name).name("person_name")
}
其中def field(m: T => Unit): FieldMap
这会触发以下警告:
Warning:(97, 13) a pure expression does nothing in statement position; you may be omitting necessary parentheses
field(_.age).name("person_age").colType[java.lang.Integer]
^
Warning:(98, 13) a pure expression does nothing in statement position; you may be omitting necessary parentheses
field(_.name).name("person_name")
^
很明显,这不是一个理想的语法。我可以通过任何方式调整field
的签名以避免警告,还是以类型安全的方式映射字段的更惯用的scala方式?
注意: @ sjrd的回答确实消除了警告,但毕竟scala反射看起来似乎不可行。我的最终目标是Mapper,它允许在编译时检查mannner而不是字符串中指定T
成员,因此它不太容易受到错字和重构问题的影响。
答案 0 :(得分:0)
field
方法将T => Unit
函数作为参数。因此,lambda _.age
(相当于x => x.age
)被视为返回Unit
。编译器警告您在语句位置(期望类型x.age
)中使用纯表达式(Unit
),这基本上意味着该表达式无用,并且可能也被删除。
您的问题有一个非常简单的症状解决方案:将m: T => Unit
替换为m: T => Any
。现在你的表达式x.age
不再处于语句位置,编译器很高兴。
但是你的代码表明存在一些错误,因为你显然不会在任何地方使用m
的结果。无论如何,为什么m
?