【发布时间】:2011-01-29 16:58:58
【问题描述】:
我正在使用返回 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 ) )
从技术上讲,它会继续,但我不断收到相同的错误:expected Int, Option[Object] found。这里是问题的重点快照:
private def foo( _items:Map[String,Object] ) ={
val bar:Option[Int] = _items get( "Bar" ) }
我怎么做错了我的隐含?我希望它能为我完成转换,而不是我每次都必须写“asInstanceOf”。
【问题讨论】:
-
顺便说一句,我真的不建议像这样的隐式转换。每当您必须在隐式转换中进行强制转换时,您都应该将其视为您可能方式偏离推荐路径的标志。
-
在处理 java.lang.object 时你会推荐什么?
-
尽管我回答了这个问题(嘿,当有一个我可以回答的问题时,我喜欢它:-)),我同意@Daniel 认为这样的隐式类型转换应该是小心使用。当然,在某些情况下运行时类型检查和强制转换是不可避免的,例如在使用返回缺少泛型类型信息的集合的遗留 Java 代码时。尽管如此,通过使这些强制转换为隐式,您可以节省一些输入(耶!),但会使您的代码的未来用户更难看到运行时类强制转换异常的风险(嘘!)。
标签: scala type-conversion implicit