Почему эти неявные преобразования привели к циклическому коду

Рассмотрим следующий код на 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

7
задан Rafał Rawicki 13 January 2012 в 10:57
поделиться