0

作为概述,我尝试使用反射从 Cassandra Java Row 动态创建案例类的构造函数,以找到案例类的主构造函数,然后尝试从 Cassandra Row 中提取值。

具体来说,我想支持案例类中的选项作为行中的可选字段,这样 case class Person(name: String, age: Option[Int]) 如果行有名称和年龄,或者只是名称(并为年龄填写无),它将成功填充。

为此,我关注了这篇非常有用的博客文章,它在案例类和地图之间实现了类似的目标。

然而,我似乎被困在试图巩固从案例类中反射性地提取类型的动态特性和准引号的编译时特性。举个例子:

我有一个类型fieldType,它可以是本机类型或本机类型的选项。如果是 Option,我想传递returnType.typeArgs.head给我的 quasiquote 构造,以便它可以从 Row 中提取参数化类型,如果不是 Option,我将传递 returnType。

if (fieldType <:< typeOf[Option[_]]) q"r.getAs[${returnType.typeArgs.head}]($fieldName)" else q"r.as[$returnType]($fieldName)"

(假设 r 是 Cassandra Rowas并且getAs存在于该行)

当我尝试编译它时,我收到一个错误,说它不知道如何处理r.as[Option[String]]。这对我来说在概念上是有意义的,因为编译器无法知道运行时比较将以哪种方式解决,因此需要检查这两种情况。

那么我该如何进行这种类型检查呢?如果我可以比较准引用中的类型fieldType和类型typeOf[Option[_]],它可能会停止抱怨,但我不知道如何比较准引用中的类型,我什至不确定这是否可能。如果我可以在准引号中提取 Option 的参数化类型,它可能会停止抱怨,但我也无法弄清楚。

抱歉,我对 Scala 很陌生,目前这些东西对我来说非常混乱和深奥。如果您想更仔细地查看我在做什么,我有一个回购:https://github.com/thurstonsand/scala-cass/blob/master/src/main/scala/com/weather/scalacass/ScalaCass。 scala ,其中有趣的部分是 ScalaCass.CaseClassRealizer,我正在 CaseClassUnitTests 中对其进行测试。

4

1 回答 1

0

我在 gitter scala/scala 页面上找到了 @liff 的帮助。显然,我错误地找到了我的 fieldType。

我在做:val fieldType = tpe.decl(encodedName).typeSignature我应该做的地方val fieldType = field.infoIn(tpe)。一旦我知道这种差异意味着什么,就会更新。

于 2016-01-12T15:07:15.513 回答