Почему Scala использует рефлексию для вызова метода структурного типа?

Если функция принимает структурный тип, она может быть определена как:

def doTheThings(duck: { def walk; def quack }) { duck.quack }

или же

type DuckType = { def walk; def quack  }
def doTheThings(duck: DuckType) { duck.quack }

Затем вы можете использовать эту функцию следующим образом:

class Dog {
    def walk { println("Dog walk") }
    def quack { println("Dog quacks") }
}

def main(args: Array[String]) {
    doTheThings(new Dog);
}

Если вы декомпилируете (в Java) классы, сгенерированные scalac для моего примера, вы увидите этот аргументdoTheThings имеет типObject и реализация использует отражение для вызова методов в аргументе (т.е.duck.quack)

Мой вопрос, почему отражение? Разве нельзя просто использовать анонимный и invokevirtual вместо рефлексии?

Вот способ перевести (реализовать) вызовы структурного типадля моего примера (Синтаксис Java, но дело в байт-коде):

class DuckyDogTest {
  interface DuckType {
    void walk();
    void quack();
  }

  static void doTheThing(DuckType d) {
    d.quack();
  }

  static class Dog {
    public void walk() { System.out.println("Dog walk"); }
    public void quack() { System.out.println("Dog quack"); }
  }

  public static void main(String[] args) {
    final Dog d = new Dog();
    doTheThing(new DuckType() {
      public final void walk() { d.walk(); }
      public final void quack() { d.quack();}
    });
  }
}

Ответы на вопрос(2)

Ваш ответ на вопрос