在 的 scaladoc 中scala.Any
,解释了运算符==
(或方法==
):
该表达式
x == that
等效于if (x eq null) that eq null else x.equals(that)
http://www.scala-lang.org/api/current/#scala.Any
对于 的子类的对象AnyRef
,我很容易理解,也没有看到什么奇怪的东西。
但是,对于 , 的值AnyVal
(我的意思是Int
, Double
,Long
等),上面的定义有些棘手(1 eq null
?如果我们不转换1
为 java.lang.Integer,这将无法编译)。而且,==
行为方式也equals()
不同。
我会举一些例子。
斯卡拉> 1 == 1 res0: 布尔 = 真 斯卡拉> 1 == 1.0 res1:布尔=真 斯卡拉> 1 == 1.2 res2: 布尔 = 假 scala> 2 == BigInt(2) res3: 布尔 = 真 scala> 2.0 == BigInt(2) res4:布尔=真 scala> 2 == BigInt(3) res5: 布尔 = 假
到目前为止,没有什么奇怪的。但是如果我们用equals()
方法做同样的事情,
scala> 1 等于 1 res7: 布尔 = 真 scala> 1 等于 1.0 res8: 布尔 = 假 scala> 1 等于 1.2 res9: 布尔 = 假 scala> 2 等于 BigInt(2) res10: 布尔 = 假 scala> 2.0 等于 BigInt(2) res11: 布尔 = 假 scala> 2 等于 BigInt(3) res12: 布尔 = 假
因此,如果类型不同,equals() 总是返回 false,而 == 测试它们是否表示相同的值,如果它们被转换为相同的类型。
在子类的情况下AnyRef
,方法==
和equals()
返回相同。
scala> BigInt(2) == 2 res25: 布尔 = 真 scala> BigInt(2) == 2.0 res26:布尔=真 scala> BigInt(3) == 2 res27: 布尔 = 假 scala> BigInt(2) 等于 2 res28: 布尔 = 真 scala> BigInt(2) 等于 2.0 res29: 布尔 = 真 scala> BigInt(3) 等于 2 res30: 布尔 = 假
那么,为什么方法==
和equals()
不同AnyVal
呢?
我正在使用 Scala 版本 2.10.2(Java HotSpot(TM) 64 位服务器 VM,Java 1.7.0_25)。
编辑 1
我看到 == 不能被直接覆盖,因为它根据Programming in Scala, 2nd Edition被定义为 Any 类中的最终方法。
编辑 2
虽然有答案,但我的问题仍然存在。我将保留这个问题。与Java
相对应的是 Java 的原始类型和.
在 Java 中,and是类,所以它们的变量是引用,可以有. 这意味着,它们就像在 Scala 中一样。不是。
Scala 的-和不能有值,Java和.
此外, Java 中的 's用于引用相等(与Scala 中相同)。
你得到什么scala.Int
scala.Long
int
long
java.lang.Integer
java.lang.Long
null
AnyRef
AnyVal
AnyVal
scala.Int
scala.Long
null
int
long
java.lang.Integer
==
eq
java.lang.Integer
在这方面,Scala REPL 中的 REPL 与您在带有 .java 源文件的纯 Java 项目中得到的完全不同。
但是,我可以从使用 Java 中的原始类型类得到的是:(这是 JAVA)
class Main {
public static void main(String[] args) {
System.out.println(String.valueOf(new java.lang.Integer(1).equals(1)));
System.out.println(String.valueOf(new java.lang.Integer(1).equals(1L)));
System.out.println(String.valueOf(new java.lang.Integer(1).equals(1.0)));
System.out.println(String.valueOf(new java.lang.Integer(1).equals(new java.lang.Integer(1))));
System.out.println(String.valueOf(new java.lang.Integer(1).equals(new java.lang.Long(1))));
}
}
输出:
真的 错误的 错误的 真的 错误的是的,它们的行为类似于 scala AnyVal 的
equals()
。但是,那么,为什么会发生这种情况呢?
Scala 的AnyVal
's是否==
对应于==
Java 的原始类型
,Scala 的 AnyVal 是否equals()
对应于equals()
Java 的类类型?
BigInt 的相等性测试怎么样?Java 中没有对应的原始类型。
问题仍然...
编辑 3
我可以从 scaladoc 中找到一些信息。( http://www.scala-lang.org/api/current/index.html#scala.Int )
我可以找到的Shadowed Implicit Value Members项目中的
隐含信息被重载为, ,和 ... ,
并将调用隐式转换, , 或.
而只为 定义,它会调用隐式转换。
也就是说,将与 相同。
仍然存在一个问题:
为什么of会超载,而of==
Char
Short
Float
==
int2double
int2float
int2long
equals()
Any
int2Integer
Int.equals()
java.lang.Integer.equals()
==
AnyVal
equals()
AnyVal
是不是超载了?