Я определил неявный класс, предоставляющий метод 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
Это соответствует моему пониманию того, как компилятор использует импликации для поиска членов, не найденных в типе напрямую.Но почему первый пример все еще работает?