[英]Scala multiple implicit conversions?
我不理解在以下代码(Scala 2.9)中看到的明显矛盾的行为:
class Pimp1(val x : Double) {
def pluss(that : Pimp1) = x + that.x
def <(that : Pimp1) = x < that.x
}
object Pimp1 {
implicit def d2pimp(d : Double) = new Pimp1(d)
implicit def d2pimp(od : Option[Double]) = new Pimp1(od.get)
}
object Scratch2 extends App {
import Pimp1._
5.0.pluss(Some(5.0))
5.0 < Some(5.0)
}
可以编译“ 5.0.pluss(Some(5.0))”行,但其后的行将不会编译,并显示以下错误消息:
重载的方法值<和其他选项:(x:双精度)布尔(x:浮点数)布尔(x:长)布尔(x:整数)布尔(x:字符)布尔(x:短)布尔(x:字节)布尔适用于(Some [Double])
如果将显式<运算符添加到采用Option [Double]的Pimp类中:
def <(that : Option[Double]) = x < that.get
一切都编译良好。
现在,以我理解Scala隐式转换规则的方式,这很有意义:
这就是我期望事情会发生的方式。
但是,这似乎与第一个示例相矛盾,其中:
根据上述逻辑,不应编译,但可以编译。 隐式转换规则是否对不存在的方法和不匹配的方法进行不同的处理?
这对我来说很有意义。 第一个起作用的是这样的:
Double是否有加号方法? 不,我们可以将其隐式转换为可转换的内容吗? 是。 好的,现在我想应用pluss方法。 需要期权吗? 不可以。我可以将Option隐式转换为所需的东西吗? 是。
第二个是这样的:
Double是否有<方法? 是。 需要期权吗? 否。我可以将Option隐式转换为<确实需要的东西吗? 没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.