隐式地将Option [Object]转换为Option [Int]

时间:2010-03-20 01:38:04

标签: scala type-conversion implicit

我正在使用返回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”。

1 个答案:

答案 0 :(得分:2)

您的隐式转化不适用,因为您的隐式转化会将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地图,那么这将解释此处的断开连接。