Являются ли неявные преобразования для числовых типов Scala особенными? - PullRequest
0 голосов
/ 20 февраля 2019

Я определил неявный класс, предоставляющий метод 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 Ответ

0 голосов
/ 20 февраля 2019

Я полагаю, что это случай численного расширения , достигаемого за счет слабого соответствия .(Существует активное предложение исключить это из языка .)

...