scala 中的综合函数“##”

2024-02-16

我最近看到一些代码,如下代码:

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

好吧,输出只是 'a' 的 ASCII 值,但让我们看一下

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

我的 IDE 告诉“##”,它是一个“合成函数”。那么 ## 是做什么的,什么是综合函数?


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

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

(来源:https://www.scala-lang.org/api/current/scala/Any.html###:Int https://www.scala-lang.org/api/current/scala/Any.html###: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/ http://javapapers.com/core-java/java-synthetic-class-method-field/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala 中的综合函数“##” 的相关文章

随机推荐