La sortie ci-dessus est une surprise pour moi - il devrait imprimer une classe. Sauf si vous voulez déclarer trait Foo
. Quelle version de Scala utilisez-vous?
La nuit donne ce qui suit comme la sortie:
Welcome to Scala version 2.9.0.r23117-b20100929093241 (Java HotSpot(TM) Server VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.
scala> class Foo {
| def foo = "foo"
| }
defined class Foo
scala> var obj = classOf[Foo]
obj: java.lang.Class[Foo] = class Foo
Dans les classes Scala de mise en œuvre JVM Scala sont généralement traduits dans une classe de bytecode JVM. Si un trait ne se compose que des déclarations de méthode comme ici:
trait Foo {
def foo: String
}
une interface Java Foo
est généré par le compilateur.
Si elle a des définitions aussi bien, comme ici:
trait Foo {
def foo = "foo"
}
le compilateur génère une interface Foo
et une classe dite de mise en œuvre avec le nom Foo$class
qui contient les corps de méthode actuelle. Cette classe d'implémentation n'est pas visible pour le programmeur. Il est utilisé pour la composition de mixin sous le capot.
Dans les deux cas, si vous utilisez classOf
construction pour obtenir l'objet de classe d'un trait, vous obtiendrez l'objet de classe Java standard pour l'interface du trait Foo
, que vous pouvez utiliser pour inspecter les méthodes de Foo
dans la de la même manière que vous le feriez pour les cours.
Err ... scala 2.8.0.final imprime java.lang.Class [Foo] = class Foo Foo –