2012-04-12 99 views
21

我知道scala中空参数和无参数方法的用法区别,我的问题与生成的类文件有关。当我看看javap的这两个类,它们看起来完全一样:Scala如何知道“def foo”和“def foo()”之间的区别?

class Foo { 
    def bar() = 123; 
} 


class Foo { 
    def bar = 123; 
} 

但是,当我在scalap看着他们,他们准确地反映参数列表。在类文件中scalac中的哪个区别是已知的?

回答

20

在.class文件中,有一个名为ScalaSig的类文件属性,其中包含Scala所需的所有额外信息。它不是由人类真正可读的,但它的存在:

$ 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^.... 

参见How is the Scala signature stored?scala.reflect.ScalaSignature,这是不是很有趣:-)

+0

谢谢!出于某种原因,-verbose从来没有从我的javap手册页跳出来,正如你所说,这不是世界上最易读的东西:) – 2012-04-12 19:32:32

相关问题