【问题标题】:How does Scala know the difference between "def foo" and "def foo()"?Scala 如何知道“def foo”和“def foo()”之间的区别?
【发布时间】:2012-04-25 04:25:48
【问题描述】:

我知道 scala 中空参数和无参数方法之间的用法差异,我的问题与生成的类文件有关。当我在 javap 中查看这两个类时,它们看起来完全一样:

class Foo {
  def bar() = 123;
}


class Foo {
  def bar = 123;
}

但是当我在 scalap 中查看它们时,它们准确地反映了参数列表。 scalac 在类文件中的什么地方可以知道这种区别?

【问题讨论】:

    标签: scala


    【解决方案1】:

    在.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,这不是很有趣:-)

    【讨论】:

    • 谢谢!出于某种原因,-verbose 从来没有从 javap 联机帮助页中跳出来,正如你所说,它不是世界上最易读的东西:)
    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2017-07-04
    • 2016-09-09
    • 2012-07-26
    相关资源
    最近更新 更多