1

から Json ファイルを生成する単純な Scala 関数がありますMap[String, Any]

  def mapToString(map:Map[String, Any]) : String = {
    def interpret(value:Any)  = {
      value match {
        case value if (value.isInstanceOf[String]) => "\"" + value.asInstanceOf[String] + "\""
        case value if (value.isInstanceOf[Double]) => value.asInstanceOf[Double]
        case value if (value.isInstanceOf[Int]) => value.asInstanceOf[Int]
        case value if (value.isInstanceOf[Seq[Int]]) => value.asInstanceOf[Seq[Int]].toString.replace("List(", "[").replace(")","]")
        case _ => throw new RuntimeException(s"Not supported type ${value}")
      }
    }
    val string:StringBuilder = new StringBuilder("{\n")
    map.toList.zipWithIndex foreach {
      case ((key, value), index) => {
        string.append(s"""  "${key}": ${interpret(value)}""")
        if (index != map.size - 1) string.append(",\n") else string.append("\n")
      }
    }
    string.append("}\n")
    string.toString
  }

このコードは問題なく動作しますが、コンパイル時に警告メッセージが出力されます。

Warning:(202, 53) non-variable type argument Int in type Seq[Int] (the underlying of Seq[Int]) 
is unchecked since it is eliminated by erasure
        case value if (value.isInstanceOf[Seq[Int]]) => 
value.asInstanceOf[Seq[Int]].toString.replace("List(", "[").replace(")","]")
                                                ^

case value if (value.isInstanceOf[Seq[Int]])が原因で警告が発生し、警告case value @unchecked if (value.isInstanceOf[Seq[Int]])を削除しようとしましたが、機能しません。

警告を削除するには?

4

3 に答える 3

2

コンポーネントのタイプをあまり気にしない場合 (そして、文字列化するだけなので気にしないようです):

case value if (value.isInstanceOf[Seq[_]]) => 
    value.asInstanceOf[Seq[_]].toString.replace("List(", "[").replace(")","]")

toString考えてみると、とにかく何でも呼び出すことができるはずです。

case value if (value.isInstanceOf[Seq[_]]) => 
    value.toString.replace("List(", "[").replace(")","]")

しかし、その後に文字列をいじる代わりに、toString考慮してくださいSeq#mkString

value.mkString("[", ",", "]")

最後に、そのパターンisInstanceOf/asInstanceOfは一致に置き換えることができます (すべての場合)

case value: Int => value    // it's an Int already now, no cast needed 
case value: Seq[_] => value.mkString("[", ",", "]")
于 2016-04-06T03:48:24.157 に答える
1

次のことができます。

case value: String => ???
case value: Double => ???
case value: Int => ???
case value: Seq[Int] @unchecked => ???

または@Thiloが言及したように

case value: Seq[_] => 
于 2016-04-06T03:54:21.770 に答える
1

これは、警告メッセージを生成しないより優れたコードです (Thilo と Łukasz からのヒントを使用)。

  def mapToString(map:Map[String, Any]) : String = {
    def interpret(value:Any)  = {
      value match {
        case value:String => "\"" + value + "\""
        case value:Double => value
        case value:Int => value
        case value:Seq[_] => value.mkString("[",",","]")
        case _ => throw new RuntimeException(s"Not supported type ${value}")
      }
    }
    map.toList.map { case (k, v) => s"""  "$k": ${interpret(v)}""" }.mkString("{\n", ",\n", "\n}\n")
  }
于 2016-04-06T14:01:02.893 に答える