首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >upickle在编写case类时给出一个ScalaReflectionException

upickle在编写case类时给出一个ScalaReflectionException
EN

Stack Overflow用户
提问于 2015-06-10 18:44:24
回答 1查看 547关注 0票数 2

我有一个简单的案例课:

代码语言:javascript
复制
object Margin {
  def apply(top: Int, right: Int, bottom: Int, left: Int): Margin = {
    Margin(Some(top), Some(right), Some(bottom), Some(left))
  }
}

case class Margin(top: Option[Int], right: Option[Int], bottom: Option[Int], left: Option[Int])

当对上述类的实例调用upickle.write时,我得到以下异常:

代码语言:javascript
复制
scala.ScalaReflectionException: value apply encapsulates multiple     
overloaded alternatives and cannot be treated as a method. Consider 
invoking `<offending symbol>.asTerm.alternatives` and manually picking 
the required method

这个错误信息意味着什么?我如何修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-10 18:44:24

上面的错误消息是Margin类具有多个重载的apply方法的结果。第一个是case类构造函数,另一个是同伴对象。Upickle不知道使用哪个apply方法,因此引发此异常。这是一个已知限制

解决方法之一是重命名同伴对象中的apply方法。另一个是编写一个定制皮克勒

下面是一个解决问题的定制pickler的笨拙版本:

代码语言:javascript
复制
object Margin {
  def create(top: Int, right: Int, bottom: Int, left: Int): Margin = {
    Margin(Some(top), Some(right), Some(bottom), Some(left))
  }

  implicit val marginWriter = upickle.Writer[Margin]{
    case m =>
      Js.Obj(fields(m).map(kv => (kv._1, Js.Num(kv._2))):_*).asInstanceOf[Js.Value]
  }

  implicit val marginReader = upickle.Reader[Margin]{
    case obj: Js.Obj =>
      val map = obj.value.toMap
      Margin(map.get("top").map(_.value.asInstanceOf[Int]),
        map.get("right").map(_.value.asInstanceOf[Int]),
        map.get("bottom").map(_.value.asInstanceOf[Int]),
        map.get("left").map(_.value.asInstanceOf[Int]))
  }

  private def fields(m: Margin) = Seq(m.top.map(("top", _)), m.right.map(("right", _)), m.bottom.map(("bottom", _)),
    m.left.map(("left", _))).flatten
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30764764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档