Scala має обмеження на автоматичні перетворення для додавання методу, яке полягає в тому, що він не застосовуватиме більше одного перетворення при спробі пошуку методів. Наприклад:
class A(val n: Int)
class B(val m: Int, val n: Int)
class C(val m: Int, val n: Int, val o: Int) {
def total = m + n + o
}
object T1 {
implicit def toA(n: Int): A = new A(n)
implicit def aToB(a: A): B = new B(a.n, a.n)
implicit def bToC(b: B): C = new C(b.m, b.n, b.m + b.n)
println(5.total)
println(new A(5).total)
println(new B(5, 5).total)
println(new C(5, 5, 10).total)
}
РЕДАГУВАТИ: Межі перегляду ('<%') застаріли, оскільки Scala 2.11 https://issues.scala-lang.org/browse/SI-7629 (Ви можете використовувати класи класів типу)
Однак, якщо неявне визначення вимагає самого неявного параметра (View bound), Scala буде шукати додаткові неявні значення стільки часу, скільки потрібно. Продовжуємо з останнього прикладу:
object T2 {
implicit def toA(n: Int): A = new A(n)
implicit def aToB[A1 <% A](a: A1): B = new B(a.n, a.n)
implicit def bToC[B1 <% B](b: B1): C = new C(b.m, b.n, b.m + b.n)
println(5.total)
println(new A(5).total)
println(new B(5, 5).total)
println(new C(5, 5, 10).total)
}
"Чарівність!", Можна сказати. Не так. Ось як компілятор переклав би кожен:
object T1Translated {
implicit def toA(n: Int): A = new A(n)
implicit def aToB(a: A): B = new B(a.n, a.n)
implicit def bToC(b: B): C = new C(b.m, b.n, b.m + b.n)
println(bToC(aToB(toA(5))).total)
println(bToC(aToB(new A(5))).total)
println(bToC(new B(5, 5)).total)
println(new C(5, 5, 10).total)
}
object T2Translated {
implicit def toA(n: Int): A = new A(n)
implicit def aToB[A1 <% A](a: A1): B = new B(a.n, a.n)
implicit def bToC[B1 <% B](b: B1): C = new C(b.m, b.n, b.m + b.n)
println(bToC(5)(x => aToB(x)(y => toA(y))).total)
println(bToC(new A(5))(x => aToB(x)(identity)).total)
println(bToC(new B(5, 5))(identity).total)
println(new C(5, 5, 10).total)
}
Отже, хоча bToC
використовується як неявне перетворення aToB
і toA
передається як неявні параметри , замість того, щоб бути прив’язаним як неявні перетворення.
РЕДАГУВАТИ
Пов’язане питання, що цікавить: