1

java.lang.objectを返すレガシーJavaコードを使用しています。私はそれを関数に渡し、そのようにいくつかの暗黙の変換を行いたいと思います:

implicit def asInt( _in:Option[Object] ) = _in asInstanceOf[ Option[Int] ]
implicit def asDouble( _in:Option[Object] = _in asInstanceOf[ Option[Double] ]

private def parseEntry( _name:String, _items:Map[String,Object] ) = _name match{
    case docName.m_Constants =>
        new Constants( _items get( Constants m_Epsilon ), _items get( Constant m_Rho ),
                       _items get( Constants m_N ) )

技術的には続行しますが、同じエラーが発生し続けます。予期されたInt、Option[Object]が見つかりました。ここでは、問題の焦点を絞ったスナップショットを示します。

private def foo( _items:Map[String,Object] ) ={
    val bar:Option[Int] = _items get( "Bar" ) }

暗黙の操作をどのように間違えましたか?毎回「asInstanceOf」を書く代わりに、それが私のために変換を行うことを望んでいました。

4

1 に答える 1

2

Option[Object]暗黙的な変換は に変換されるため、暗黙的な変換は適用されませんが、コードは に変換するOption[Int]ことを期待しているようです。ObjectOption[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 マップを使用している場合、ここで切断が説明されます。

于 2010-03-20T02:23:06.753 に答える