【问题标题】:Match on Scala Manifest匹配 Scala Manifest
【发布时间】:2018-10-18 13:01:41
【问题描述】:

我有一个将 json 解析为对象的方法。目前我有两个 def 做同样的事情,除了一个解析 A 而另一个解析 List[A]

看起来是这样的:

def parse[A <: V2Model](mf: Manifest[A]) = {
  // doing parsing
}

def parseList[A <: V2Model](mf: Manifest[List[A]]) = {
  // doing parsing of list
}

有两个相同的'def'不太可读。清单不是隐含的。

有没有办法在 Manifest 上进行匹配?

我试过这个没有成功:

def parse[A <: V2Model](mf: Manifest[A]) = {
  mf match {
    case _ : Manifest[List[A]] => // do list parsing
    case _ : Manifest[A] => // do object parsing
  }
}

【问题讨论】:

    标签: scala pattern-matching


    【解决方案1】:

    如果 A 是 V2Model 的子类型,则 "mf: Manifest[A]" 永远不会是 Manifest[List[A]]。

    A 和 List[A] 之间也没有共同的返回类型,所以不可能实现你想要的。

    问题是,为什么要在解析列表和解析对象时表现不同?序列化框架已经解决了这个问题。

    【讨论】:

    • 感谢您的回复。此代码适用于具有大量旧模型的 临时 代理,这些旧模型需要表现得像新 (v2) 模型。我知道它很丑,但它的开发速度非常快。现在我只是试图重构它的某些部分。
    • 你可能需要这个签名的东西: def parse[A](json: String)(implicit mf: Manifest[A]): A (or returned Try[A], Either[ParseError, A ], ETC)。这应该适用于普通对象和列表。
    【解决方案2】:

    一般来说不是,但对于这种情况(而且仍然很丑):

    if (mf.runtimeClass == classOf[List[_]]) {
      // a list manifest
    } else {
      // not a list manifest
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 2016-05-17
      • 2021-12-17
      • 2011-08-25
      • 1970-01-01
      • 2014-09-30
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多