找不到类java.lang.Object的ScalaSig

时间:2016-03-21 23:48:47

标签: scala json4s

未在以下主题中找到答案:firstsecond

有下一个问题。我有一个名为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

1 个答案:

答案 0 :(得分:2)

我认为这与我遇到的问题类似。

首先,ScalaSigreader#42

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)

另见:

Issue #403

Pull #436