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

时间:2019-02-20 11:49:01

标签: scala numbers implicit-conversion

我定义了一个隐式类,该类在foo的所有实例上提供方法Double。奇怪的是,现在也可以将此方法称为在Float实例上,如scalac 2.12.5(使用-Xscript Foo)接受的以下示例所示:

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

val x: Float = 1f
val y = x.foo

如果我尝试对自己的类型执行相同操作,分别用FloatDouble替换MyFloatMyDouble,则fooMyFloat个实例。

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

$ 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

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

1 个答案:

答案 0 :(得分:5)

我认为这是numeric widening通过weak conformance实现的一种情况。 (有一个针对drop this from the language的积极建议。)