我定义了一个提供方法的隐式类 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
以及 Double
与 MyFloat
以及 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
这符合我对编译器如何使用隐式来搜索在类型上未直接找到的成员的理解。但为什么第一个例子仍然有效?
1条答案
按热度按时间o75abkj41#
我相信这是一个通过弱一致性实现数字加宽的例子(有一个积极的建议是从语言中去掉这个。)