【问题标题】:Can't find ScalaSig for class java.lang.Object找不到类 java.lang.Object 的 ScalaSig
【发布时间】:2016-03-21 23:48:46
【问题描述】:

在这些主题中没有找到答案: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 或惰性 val 字段扩展某些特征的案例类,则会出现同样的异常:

trait Bar {
   val list: List[Int] = List(1,2,3)
}

case class Example(field: Double) extends Bar

【问题讨论】:

  • 尝试使用 bigint 而不是 int。
  • 我问的不是如何解决这个问题,而是问为什么会发生这种情况。不得不提的是,这适用于 String

标签: scala json4s


【解决方案1】:

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

首先,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多