Scala数字类型的隐式转换是否特殊?

Feu*_*mel 1 scala numbers implicit-conversion

我已经定义了一个隐式类,它为foo所有实例提供了一个方法Double.奇怪的是,现在也可以在Float实例上调用此方法,这由scalac2.12.5(使用-Xscript Foo)接受的以下示例显示:

implicit class DoubleOps(value: Double) {
  def foo: Double = value
}

val x: Float = 1f
val y = x.foo
Run Code Online (Sandbox Code Playgroud)

如果我尝试对我自己的类型执行相同操作,则分别替换FloatDouble使用MyFloat和实例不可用.MyDoublefooMyFloat

trait MyDouble

object MyDouble {
  implicit class MyFloatAsMyDouble(value: MyFloat) extends MyDouble
}

trait MyFloat

implicit class MyDoubleOps(value: MyDouble) {
  def foo: MyDouble = value
}

val x: MyFloat = new MyFloat { }
val y = x.foo
Run Code Online (Sandbox Code Playgroud)

$ scalac -Xscript Foo foo.scala
foo.scala:14: error: value foo is not a member of this.MyFloat
val y = x.foo
          ^
one error found
Run Code Online (Sandbox Code Playgroud)

这符合我对编译器如何使用implicits直接搜索在类型上找不到的成员的理解.但为什么第一个例子仍然有效呢?

jwv*_*wvh 5

我相信这是通过弱一致性实现数字扩展的情况.(有一个积极的建议是从语言中删除它.)