Рассмотрим следующий код на Scala:
object Test {
class A {}
class B extends A {}
class AI extends A {
def sayHello: String = "Hello from AI"
}
implicit def AtoAI(a: A): AI = a
class BI extends B {
def sayHello: String = "Hello from BI"
}
implicit def BtoBI(b: B): BI = b
def main(args: Array[String]) {
val a = new A
println(a.sayHello)
val b = new B
println(b.sayHello)
}
}
Использование имплицитов приводит к зацикливанию кода. Фактически, разборка показывает, что сгенерированные методы преобразования содержат только goto 0
внутри:
public Test$AI AtoAI(Test$A);
Code:
0: goto 0
public Test$BI BtoBI(Test$B);
Code:
0: goto 0
Что вызывает такое поведение? Я понимаю, что иерархия классов здесь вызывает подозрение, но неявное преобразование должно применяться только один раз.
Я использую Scala 2.9.1