scala宏创建java bean类时出现未知类型错误
发布时间:2020-12-16 08:43:51 所属栏目:安全 来源:网络整理
导读:我创建了以下代码片段,用作 scala类型到 java类型的编码生成器. object Macros { def encode[A : Product,B](value:A):B = macro MacrosImpl.encode_impl[A,B]}class MacrosImpl(val c:Context) { import c.universe._ def encode_impl[ScalaType: c.WeakTyp
我创建了以下代码片段,用作
scala类型到
java类型的编码生成器.
object Macros { def encode[A <: Product,B](value:A):B = macro MacrosImpl.encode_impl[A,B] } class MacrosImpl(val c:Context) { import c.universe._ def encode_impl[ScalaType: c.WeakTypeTag,JavaType: c.WeakTypeTag](value:c.Expr[ScalaType]) = { val scalaType: WeakTypeTag[ScalaType] = implicitly[WeakTypeTag[ScalaType]] val fields = scalaType.tpe.typeSymbol.companion.typeSignature.members.collectFirst { case method if method.name.toString == "apply" => method }.toList.flatMap(_.asMethod.paramLists.flatten). map{ case s if s.name.toString == "id" => q"underlying.setId($value.$s.orNull)" case s => q"underlying.${c.universe.newTermName("set" + s.name.toString.capitalize) }($value.$s)" } val javaType: WeakTypeTag[JavaType] = implicitly[WeakTypeTag[JavaType]] q""" val underlying = new ${javaType.tpe}() ..$fields underlying """ } } 这个编译在宏项目编译时很好,当我尝试使用它.它在使用库项目编译时抛出异常. private val x: IpDataEntry = IpDataEntry(None,"a","a") println(Macros.encode[IpDataEntry,Underlying](x)) //not comp [error] Unknown type: <error>,<error> [class scala.reflect.internal.Types$ErrorType$,class scala.reflect.internal.Types$ErrorType$] TypeRef? false [trace] Stack trace suppressed: run 'last web/compile:compile' for the full output. [error] (web/compile:compile) scala.reflect.internal.FatalError: Unknown type: <error>,class scala.reflect.internal.Types$ErrorType$] TypeRef? false [error] Total time: 12 s,completed Jun 19,2014 11:53:42 AM 我被困在这里,我的代码中找不到任何错误. Scala版本是2.11.1. 解决方法
我自己找到了解决方案.在代码块中
q"underlying.setId($value.$s.orNull)" $s不是TermName.所以我把它修改为 q"underlying.setId($value.${c.universe.newTermName(s.name.toString)}.orNull)" 无论如何,如果该错误指向语法树中的正确问题,那么它真的很有用.我浪费了大约2天来找出问题所在. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |