2012-04-12 8 views
21

Ich weiß über den Verwendungsunterschied zwischen leer-Parameter und parameterless Methoden in Scala, und meine Frage bezieht sich auf die generierte Klassendatei. Als ich in diesen beiden Klassen in javap schauen, schauen sie genau das gleiche:Wie kennt Scala den Unterschied zwischen "def foo" und "def foo()"?

class Foo { 
    def bar() = 123; 
} 


class Foo { 
    def bar = 123; 
} 

Aber wenn ich sie in scalap sehen, sie spiegeln genau die Parameterlisten. Wo in der Klassendatei ist scalac diese Unterscheidung bekannt?

Antwort

20

In der .class-Datei gibt es ein Klassendateiattribut namens ScalaSig, das alle von Scala benötigten zusätzlichen Informationen enthält. Es ist nicht wirklich lesbar durch die Menschen, aber es ist da:

$ javap -verbose Foo.class 
const #195 = Asciz  ScalaSig; 
const #196 = Asciz  Lscala/reflect/ScalaSignature;; 
const #197 = Asciz  bytes; 
const #198 = Asciz  ^F^A!3A!^A^B^A^S\t\tb)^[7f^Y^Vtw\r^^5DQ^V^\7.^Z:^K^E\r!^ 
Q^A^B4jY^VT!!^B^D^B^UM^\^W\r\1tifdWMC^A^H^.... 

Siehe auch How is the Scala signature stored? und scala.reflect.ScalaSignature, das nicht sehr interessant :-)

+0

Dank ist! Aus irgendeinem Grund hat mich -verbose nie aus der javap-Manpage herausgesprungen, und wie du schon sagtest, es ist nicht die menschlichste Sache der Welt :) –

Verwandte Themen