46 votes

Comment les traits Scala sont-ils compilés en bytecode Java?

J'ai joué un peu avec Scala pour un certain temps maintenant, et je sais que les traits peuvent agir comme la Scala équivalent de deux interfaces et les classes abstraites. Comment sont exactement les traits compilé en bytecode Java?

J'ai trouvé quelques brèves explications qui ont déclaré que les traits sont compilés exactement comme les interfaces de Java, si possible, et des interfaces avec une classe supplémentaire autrement. Je ne comprends toujours pas, cependant, comment Scala atteint la classe de linéarisation, une fonctionnalité non disponible dans Java.

Est-il une bonne source d'expliquer comment les caractères compile en bytecode Java?

67voto

Mitch Blevins Points 7646

Je ne suis pas un expert, mais ici, c'est ma compréhension:

Les Traits sont compilées dans une interface et la classe correspondante.

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

devient l'équivalent de...

public interface Foo {
  public void bar();
}

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

D'où la question: Comment la statique de la méthode de barre dans Foo$classe appelée? Cette magie est fait par le compilateur dans la classe Foo trait est mélangé dans.

class Baz extends Foo

devient quelque chose comme...

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

Classe de linéarisation juste implémente la version appropriée de la méthode (en appelant la méthode statique dans le Xxxx de classe$classe) en fonction de la linéarisation des règles définies dans la spécification du langage.

2voto

user1338062 Points 1553

Une très bonne explication de ceci est dans:

Le guide du développeur Java chargé sur Scala: Des traits et des comportements - Traits dans la JVM

Citation:

Dans ce cas, il [le compilateur] supprime les implémentations de méthodes et les déclarations de champs définies dans le trait dans la classe qui implémente le trait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X