Or *_*les 8 scala implicit-conversion
我不明白我在下面的代码(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)
}
Run Code Online (Sandbox Code Playgroud)
行'5.0.pluss(Some(5.0))'编译,但它后面的行不会编译,并显示以下错误消息:
重载方法值<with alternatives:(x:Double)Boolean(x:Float)Boolean(x:Long)Boolean(x:Int)Boolean(x:Char)Boolean(x:Short)Boolean(x:Byte)布尔值不能适用于(某些[双])
如果我将显式的<运算符添加到Pimp类中,该类采用Option [Double]:
def <(that : Option[Double]) = x < that.get
Run Code Online (Sandbox Code Playgroud)
一切都很好.
现在,我理解Scala隐式转换规则的方式,这很有道理:
这就是我期望事情发挥作用的方式.
但是,这似乎与第一个例子相矛盾,其中:
根据上面的逻辑,这不应该编译,但确实如此.隐式转换规则是否以不同方式处理不存在的方法和不匹配的方法?
这对我来说很有意义.第一个,工作原理如下:
Double有一个pluss方法吗?不,我们可以隐含地将其转换为具有某种功能的东西吗?是.好的,现在我想应用pluss方法.是否需要选项?不能.我可以将Option明确地转换为它需要的soemthing吗?是.
第二个是这样的:
Double有一个<方法吗?是.是否需要选项?不,我可以隐式地将Option转换为<确实需要的东西吗?没有.