Maps [String、Any]からクラスをインスタンス化しようとしており、いくつかのjson-rpcを介して受信しています。だから私は次の問題になってしまいます:
val mpa:Map[String, Any] = Map("key"->0.0)
implicit def anyToInt(a:Any):Int = a.asInstanceOf[Double].toInt
キーが存在する場合、すべてOKです。
val i:Int = mpa.getOrElse("key", 0.0)
i: Int = 0
しかし、キーが欠落している場合...:
scala> val i:Int = mpa.getOrElse("val", 0.0)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
at scala.runtime.BoxesRunTime.unboxToDouble(Unknown Source)
at .anyToInt(<console>:13
ここで、冗長性を次のように追加するとします。
implicit def anyToInt(a:Any):Int = {
println(a)
val b = a.asInstanceOf[Double].toInt
println("converted")
b
}
私たちは得ました:
val i:Int = mpa.getOrElse("val", 0.0)
0.0
converted
0
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
.....
だから私はanyToIntが2回呼び出されるという結論に達しました。そして、2回目はIntをAnyとして受け取りました。
質問:
なぜ ?!
これを回避するにはどうすればよいですか?
PS:初心者の質問ならごめんなさい。私はscalaが初めてです。