Ответ 1
В основном это псевдоним hashCode
, с несколькими примечательными исключениями, которые делают его несколько более безопасным:
Эквивалент
x.hashCode
, за исключением числовых типов в ящике иnull
. Для чисел он возвращает хеш-значение, которое соответствует значению равенства: если два экземпляра типа значения сравниваются как истинные, то ## будет выдавать одно и то же значение хэша для каждого из них. Дляnull
возвращает хэш-код, гдеnull.hashCode
выбрасываетNullPointerException
.
(источник: http://www.scala-lang.org/api/current/index.html#[email protected]##():Int)
Примеры:
нормальное значение
scala> val x: Any = "a"
x: Any = a
scala> x.hashCode
res2: Int = 97
scala> x.##
res3: Int = 97
значение null
scala> null.hashCode
java.lang.NullPointerException
... 33 elided
scala> null.##
res5: Int = 0
Вместо этого синтетическое поле является полем, генерируемым компилятором для работы с ограничениями JVM, особенно при работе с внутренними анонимными классами, концепцией, не относящейся к JVM.
Вот хорошее объяснение того, что это означает в деталях: http://javapapers.com/core-java/java-synthetic-class-method-field/