如何在不触发编译器警告的情况下对收集类型使用Scala匹配/案例

时间:2015-03-29 12:44:43

标签: scala

我的代码正在分析通过JSON返回的结构。我采用解析后的JSON并使用匹配/大小写来确定在进一步处理之前是否有Map [String,Any]。它工作正常,但编译器警告我类型擦除,具体来说,据我所知,因为类型String在运行时不可用。这在功能方面对我来说没有问题,因为我只需要知道我们有Map就足够了。但我很欣赏这个警告,并希望以一种明确表示没有发生这种运行时检查并消除警告的方式对其进行编码。我尝试简单编码Map而不是Map [...],但是没有编译。我也试过Map [A​​ny,Any],但仍会产生警告。

我正在寻求建议。

此外,我很困惑为什么后来使用List [Any]的案例不会导致发出类似的警告。

这是代码片段:

  // Parse JSON result - returns List[Any] or Map[String,Any], depending...
  val jo = scala.util.parsing.json.JSON.parseFull(json)
  //println("\nParsed JSON structure: "+jo)
  jo match {
    case Some(v)  => {
      val pjo = jo.get
      println()
      pjo match {
        case p: Map[String,Any] => {
          //println("Is a Map")
          val eList = p.get("error")
          if (eList.size > 0) {
            println("Errors:")
            for (e <- eList) println(e)
            println
          }
        }
        case p: List[Any] => println("Is a List")
        case p => println("Is a "+p.getClass.getName)
      }
    }
    case None => println("JSON parsing returned None")
  }

警告:

... X.scala:149: non-variable type argument String in type pattern Map[String,Any] is unchecked since it is eliminated by erasure

1 个答案:

答案 0 :(得分:1)

您需要使用下划线:

case p: Map[_, _] => ...
case p: List[_] => ...