scala中的合成函数"##"

fil*_*cks 17 scala

我最近看到一些像这段代码的代码:

val x: Any = "a"
val y = x.## // y: Int = 97
Run Code Online (Sandbox Code Playgroud)

好吧,确定输出只是'a'的ASCI值,但让我们来看看

List(1,2).## // Int = 985731359
List(1,2).toString.## // Int = 1063384434
Run Code Online (Sandbox Code Playgroud)

我的IDE讲述'##'它是一个'综合功能'.那么##在做什么,什么是合成功能呢?

Gab*_*lla 19

它基本上是别名hashCode,有几个值得注意的例外使它更安全:

相当于x.hashCode盒装数字类型和null.对于数字,它返回一个与值相等一致的哈希值:如果两个值类型实例比较为true,则##将为每个值生成相同的哈希值.对于null返回null.hashCode抛出a 的哈希码NullPointerException.

(来源:http://www.scala-lang.org/api/current/index.html#scala.Any@##( ) : Int)

例子:

正常值

scala> val x: Any = "a"
x: Any = a

scala> x.hashCode
res2: Int = 97

scala> x.##
res3: Int = 97
Run Code Online (Sandbox Code Playgroud)

空值

scala> null.hashCode
java.lang.NullPointerException
  ... 33 elided

scala> null.##
res5: Int = 0
Run Code Online (Sandbox Code Playgroud)

相反,合成字段是由编译器生成的字段,用于解决底层JVM限制,尤其是在处理内部匿名类时,这是一个与JVM无关的概念.

以下是对其含义的详细解释:http://javapapers.com/core-java/java-synthetic-class-method-field/