我最近看到了一些像这段代码的代码:
val x: Any = "a"
val y = x.## // y: Int = 97
嗯,好的,输出只是' a'的ASCI值,但是让我们来看看
List(1,2).## // Int = 985731359
List(1,2).toString.## // Int = 1063384434
我的IDE讲述' ##'这是一个合成功能'。那么##做什么,什么是综合功能?
答案 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/