Option[Object]
暗黙的な変換は に変換されるため、暗黙的な変換は適用されませんが、コードは に変換するOption[Int]
ことを期待しているようです。Object
Option[Int]
でラップ_items get( "Bar" )
して、 の代わりにSome()
を取得し、暗黙的な変換が開始されるかどうかを確認してください。Option[Object]
Object
編集:実際には、(コメントで正しく指摘したように) Scala マップがオプションを返すことを考えると、これが機能しない理由がわかりません。次のコードは私にとっては機能し、期待どおりに「37」を出力します。
import scala.collection.mutable.Map
import scala.collection.mutable.HashMap
object ImplicitConversions {
implicit def asInt( _in:Option[Object] ) = _in.asInstanceOf[Option[Int]]
implicit def asDouble( _in:Option[Object] ) = _in.asInstanceOf[Option[Double]]
private def foo( _items:Map[String,Object] ) = {
val bar:Option[Int] = _items.get("Bar")
println(bar.get.intValue)
}
def main(args: Array[String]) {
val map:Map[String,Object] = new HashMap[String, Object]
map.put("Bar", Integer.valueOf(37))
foo(map)
}
}
ただし、Java マップを使用する場合は、次のようにラッピングしSome()
ます。
import java.util.Map
import java.util.HashMap
object ImplicitConversions {
implicit def asInt( _in:Option[Object] ) = _in.asInstanceOf[Option[Int]]
implicit def asDouble( _in:Option[Object] ) = _in.asInstanceOf[Option[Double]]
private def foo( _items:Map[String,Object] ) = {
val intermediate = Some(_items.get("Bar"))
val bar:Option[Int] = intermediate
println(bar.get.intValue)
}
def main(args: Array[String]) {
val map:Map[String,Object] = new HashMap[String, Object]
map.put("Bar", Integer.valueOf(37))
foo(map)
}
}
(変換を機能させるために、結果を中間変数に格納する必要があったことに注意してください。Some()
おそらく、Scala の専門家がその中間ステップを回避する方法を教えてくれるでしょう。;-))
コード内で Scala マップと Java マップが混同されている可能性はありますか? レガシー Java コードを呼び出していると言っていましたが、それが最初にこの暗黙的な変換をすべて行う必要があった理由です。Scala マップを使用していると思われるときに Java マップを使用している場合、ここで切断が説明されます。