有下一个问题。我有一个名为Foo的案例类:
case class Foo(a: Int, b: List[Int])
当我需要创建这个类的AST时,我调用Extraction.decompose(<instance of Foo>)
并获得foo实例的AST表示。
但是如果我将字段b
设为私有
case class Foo(a: Int, private val b: List[Int])
我得到org.json4s.package$MappingException: Can't find ScalaSig for class java.lang.Object
例外。
仅适用于作为集合的私有字段。
如果私有字段是简单对象,它就不会出现在AST中。 为什么会发生这种异常?
修改 如果我有一个使用val或lazy val字段扩展某些特征的case类,则会出现同样的异常:
trait Bar {
val list: List[Int] = List(1,2,3)
}
case class Example(field: Double) extends Bar
答案 0 :(得分:2)
我认为这与我遇到的问题类似。
if (current == null)
应该是
if (current == classOf[java.lang.Object])
然后,您将收到更有用的错误消息:“无法从Foo中找到字段b”。但这本身并不能解决问题。
我没有考虑修复私有字段问题。但是,我确实修复了界面问题。对于该问题,需要修改ScalaSigReader#45。
目前,如果找不到该字段,则搜索超类:
findField(findClass(current), name).getOrElse(read(current.getSuperclass))
还必须搜索接口:
findField(current, name)
.orElse(current.getInterfaces.flatMap(findField(_, name)).headOption)
.getOrElse(read(current.getSuperclass))
private def findField(clazz: Class[_], name: String): Option[MethodSymbol] =
findField(findClass(clazz), name)
另见: