代码之家  ›  专栏  ›  技术社区  ›  wheaties

将option[object]隐式转换为option[int]

  •  1
  • wheaties  · 技术社区  · 14 年前

    我使用的是遗留Java代码,它返回java. Lang.Objor。我将它传递到一个函数中,我想进行一些隐式转换,如下所示:

    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”。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Joe Carnahan    14 年前

    您的隐式转换不适用,因为您的隐式转换将转换 Option[Object] Option[Int] ,但您的代码似乎希望它转换 Object 选项[ int ] .

    试包装 _items get( "Bar" ) 具有 Some() 得到一个 选项[对象] 而不仅仅是一个 对象 看看你的内隐转换是否生效。

    编辑: 实际上,我不确定为什么这对您不起作用,考虑到这一点(正如您在评论中正确指出的),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映射,那么用 某物() 作品:

    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)
        }
    }
    

    (注意,我必须存储 某物() 在一个中间变量中使转换工作-也许scala中的某个专家可以告诉我如何避免中间步骤。;(-))

    斯卡拉和Java地图有可能在你的代码中混为一谈吗?您确实说过您正在调用遗留Java代码,这就是为什么您必须首先完成所有的隐式转换。如果在使用Scala映射时使用Java映射,那么这将解释这里的断开。