Подтвердить что ты не робот

Как Scala знает разницу между "def foo" и "def foo()"?

Я знаю о различии использования методов empty-parameter и без параметров в scala, и мой вопрос относится к сгенерированному файлу класса. Когда я смотрю на эти два класса в javap, они выглядят точно так же:

class Foo {
  def bar() = 123;
}


class Foo {
  def bar = 123;
}

Но когда я смотрю на них в скайпапе, они точно отражают списки параметров. Где в файле класса есть скалак, чтобы узнать это различие?

4b9b3361

Ответ 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^....

См. также Как хранится подпись Scala? и scala.reflect.ScalaSignature, что не очень интересно: -)