合成功能" ##"在斯卡拉

时间:2015-08-17 15:52:36

标签: scala

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

val x: Any = "a"
val y = x.## // y: Int = 97

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

List(1,2).## // Int = 985731359
List(1,2).toString.## // Int = 1063384434

我的IDE讲述' ##'这是一个合成功能'。那么##做什么,什么是综合功能?

1 个答案:

答案 0 :(得分:18)

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

  

除了盒装数字类型和x.hashCode外,等效于null。对于数字,它返回一个与值相等一致的哈希值:如果两个值类型实例比较为true,则##将为每个值生成相同的哈希值。对于null,返回一个哈希码,其中null.hashCode会抛出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

空值

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/