Scala的原始类型是如何实现的
创始人
2024-04-19 05:10:41
0

这些都是怎么实现的?实际上,Scala以与Java同样的方式存储整数:把它当作32位的字。这对在JVM上的效率以及与Java库的互操作性方面来说都很重要。标准的操作如加法或乘法都被实现为原始操作。然而,当整数需要被当作(Java)对象看待的时候,Scala使用了“备份”类java.lang.Integer。如在整数上调用toString方法或者把整数赋值给Any类型的变量时,就会这么做。需要的时候,Int类型的整数能被透明转换为java.lang.Integer类型的“装箱整数”。

51CTO编辑推荐:Scala编程语言专题

所有这些听上去都近似Java5里的自动装箱并且它们的确很像。不过有一个关键差异,Scala里的装箱比Java里的更少看见。尝试下面的Java代码:

  1. // Java代码  
  2. boolean isEqual(int x,int y) {  
  3.  return x == y;  
  4. }  
  5. System.out.println(isEqual(421,421));  
你当然会得到true。现在,把isEqual的参数类型变为java.lang.Integer(或Object,结果都一样):

  1. // Java代码  
  2. boolean isEqual(Integer x, Integery) {  
  3.  return x == y;  
  4. }  
  5. System.out.println(isEqual(421,421));  
你会发现你得到了false!原因是数421被装箱了两次,因此参数x和y是两个不同的对象。

因为在引用类型上==表示引用相等,而Integer是引用类型,所以结果是false。这是展示了Java不是纯面向对象语言的一个方面。我们能清楚观察到原始类型和引用类型之间的差别。

现在在Scala里尝试同样的实验:

  1. scala>def isEqual(x:Int, y:Int) = x == y  
  2. isEqual:(Int,Int)Boolean  
  3. scala>isEqual(421,421)  
  4. res10:Boolean = true 
  5. scala>def isEqual(x:Any, y:Any) = x == y  
  6. isEqual:(Any,Any)Boolean  
  7. scala>isEqual(421,421)  
  8. res11:Boolean = true 
实际上Scala里的相等操作==被设计为透明的参考类型代表的东西。对值类型来说,就是自然的(数学或布尔)相等。对于引用类型,==被视为继承自Object的equals方法的别名。这个方法被初始地定义为引用相等,但被许多子类重载实现它们种族的相等概念。这也意味着Scala里你永远也不会落入Java知名的关于字串比较的陷阱。Scala里,字串比较以其应有的方式工作:

  1. scala>val x = "abcd".substring(2)  
  2. x:java.lang.String = cd  
  3. scala>valy="abcd".substring(2)  
  4. y:java.lang.String=cd  
  5. scala>x==y  
  6. res12:Boolean=true 
Java里,x与y的比较结果将是false。程序员在这种情况应该用equals,不过它容易被忘记。

然而,有些情况你需要使用引用相等代替用户定义的相等。例如,某些时候效率是首要因素,你想要把某些类哈希合并:hash cons然后通过引用相等比较它们的实例。 为这种情况,类AnyRef定义了附加的eq方法,它不能被重载并且实现为引用相等(也就是说,它表现得就像Java里对于引用类型的==那样)。同样也有一个eq的反义词,被称为ne。例如:

  1. scala>val x = new String("abc")  
  2. x:java.lang.String = abc  
  3. scala>val y = new String("abc")  
  4. y:java.lang.String = abc  
  5. scala>x == y  
  6. res13:Boolean = true 
  7. scala>x eq y  
  8. res14:Boolean = false 
  9. scala>x ne y  
  10. res15:Boolean = true 

Scala的相等性会在第28章中讨论。

【相关阅读】

  1. Scala的类层级
  2. Scala中的Spiral程序:把代码都螺旋在一起
  3. Scala中变高变宽的实现:heighten和widen
  4. 学习Scala的定义工厂对象
  5. 如何实现Scala的above,beside和toString

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...