scala数字类型的隐式转换是特殊的吗?

e37o9pze  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(389)

我定义了一个提供方法的隐式类 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

如果我试着用我自己的类型做同样的事情 Float 以及 DoubleMyFloat 以及 MyDouble 分别是, foo 在上不可用 MyFloat 示例。

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

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

o75abkj4

o75abkj41#

我相信这是一个通过弱一致性实现数字加宽的例子(有一个积极的建议是从语言中去掉这个。)

相关问题