Как черты Scala компилируются в байт-код Java?

Я играл вокруг с Scala некоторое время теперь, и я знаю, что черты могут действовать как Scala, эквивалентный и интерфейсов и абстрактных классов. Как точно черты компилируются в байт-код Java?

Я нашел некоторые короткие объяснения, которые указали, что черты компилируются точно как интерфейсы Java, если это возможно, и интерфейсы с дополнительным классом иначе. Я все еще не понимаю, однако, как Scala достигает линеаризации класса, функция, не доступная в Java.

Существует ли хороший источник, объясняющий, как черты компилируют в байт-код Java?

45
задан Peter Mortensen 22 May 2013 в 13:06
поделиться

1 ответ

Я не эксперт, но вот мое понимание:

трейты компилируются в интерфейс и соответствующий класс.

trait Foo {
  def bar = { println("bar!") }
}

становится эквивалентом...

public interface Foo {
  public void bar();
}

public class Foo$class {
  public static void bar(Foo self) { println("bar!"); }
}

Что оставляет вопрос: Как вызывается статический метод bar в классе Foo$class? Эта магия делается компилятором в классе, в который подмешивается признак Foo.

class Baz extends Foo

становится чем-то вроде...

public class Baz implements Foo {
  public void bar() { Foo$class.bar(this); }
}

Линеаризация класса просто реализует соответствующую версию метода (вызов статического метода в классе Xxxx$class) в соответствии с правилами линеаризации, определенными в спецификации языка.

66
ответ дан 26 November 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: