2010-09-29 5 views
1

Dans Scala, il existe des méta-objets comme java.lang.Class et java.lang.reflect.Method. Mais quel métaobjet existe pour les traits?Scala: Metaobject pour les traits

class Foo { 
    def foo = "foo" 
} 

var obj = classOf[Foo] 

obj // java.lang.Class[Foo] = interface Foo 

Il imprime l'interface. Qu'est-ce que c'est?

+1

Err ... scala 2.8.0.final imprime java.lang.Class [Foo] = class Foo Foo –

Répondre

6

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.

+2

classe $ est en fait réalisable par une supercherie comme: classof [Foo] .getClassLoader.getClass ("Foo $ class "). Mais en général, la réponse est sur place. – jsuereth

+0

Nice, je n'y ai pas pensé. – axel22