Scala将隐式函数应用于集合
编辑:我正在使用
Scala 2.9.2
在Scala中,我定义了一个包装Double的自定义类: class DoubleWrap( d : Double ) { def double( ) = d * 2 } 以及从Double到DoubleWrap的隐式转换: implicit def wrapDouble( d : Double ) = new DoubleWrap( d ) 这允许我执行以下操作: scala> 2.5.double res0: Double = 5.0 但是,由于Scala中从Int到Double的隐式转换,我还可以执行以下操作: scala> 2.double res1: Double = 4.0 此运算符也可以使用map应用于双类型集合的所有元素 scala> List( 1.0,2.0,3.0 ).map( _.double ) res2: List[Double] = List(2.0,4.0,6.0) 但是,如果我尝试将该函数应用于整数集合的所有元素,则它不起作用: scala> List( 1,2,3 ).map( _.double ) <console>:10: error: value double is not a member of Int List( 1,3 ).map( _.double ) 有谁知道为什么会这样? 解决方法
在scala中,隐式转换不会自动链接.换句话说,编译器将寻找允许代码有意义的单个隐式转换,它永远不会尝试应用两个(或更多)连续的隐式转换.
在您的示例中,您可以执行2.double这一事实与Predef中从Double到Int的隐式转换无关. scala> val i: Int = 2 i: Int = 2 scala> i.double <console>:13: error: value double is not a member of Int i.double 它不编译. 总而言之,scala不会尝试同时应用两个隐式转换是正常的,但由于某种原因,此规则似乎不适用于常量表达式. 现在,为了解决您的问题:只需修改隐式转换,使其接受任何本身可隐式转换为Double的类型.实际上,这允许链接隐式转换: implicit def wrapDouble[T <% Double]( d : T ) = new DoubleWrap( d ) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |