我正在使用返回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”。
答案 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地图,那么这将解释此处的断开连接。