2016-04-06 13 views
1

私はMap[String, Any]からJsonファイルを生成する単純なScala関数を持っています。Scalaで "消去によって消去されました"という警告を取り除く

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 @unchecked if (value.isInstanceOf[Seq[Int]])を試してみましたが、それは動作しませんcase value if (value.isInstanceOf[Seq[Int]])ライン。

警告を削除するにはどうすればよいですか?

+1

'mkString'を見てみてください。あなたの機能が多く簡略化できるようです。 $ {interpret(v)} "" ".mkString(" {\ n "、"、\ n "、" \ n "、" "\ n} \ n") ' –

+0

@Łukasz:それは素晴らしいです。ありがとう! – prosseek

答えて

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("[", ",", "]") 
01を考えますあなたは次のことを行うことができます最後に、そのパターン isInstanceOf/ asInstanceOfは(すべてのケースでは)試合に置き換えることができ

case value: Int => value // it's an Int already now, no cast needed 
case value: Seq[_] => value.mkString("[", ",", "]") 
1

を、

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

または@Thiloが

を述べたように
case value: Seq[_] => 
1

これは警告メッセージを生成しない優れたコードです(Thilo 01のヒントŁ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") 
    } 
関連する問題