温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Scala的原始类型是怎么实现的

发布时间:2021-07-15 09:47:10 来源:亿速云 阅读:158 作者:chen 栏目:编程语言

本篇内容主要讲解“Scala的原始类型是怎么实现的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala的原始类型是怎么实现的”吧!

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

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

// Java代码  boolean isEqual(int x,int y) {   return x == y;  }  System.out.println(isEqual(421,421));

你当然会得到true。现在,把isEqual的参数类型变为java.lang.Integer(或Object,结果都一样):

// Java代码  boolean isEqual(Integer x, Integery) {   return x == y;  }  System.out.println(isEqual(421,421));

你会发现你得到了false!原因是数421被装箱了两次,因此参数x和y是两个不同的对象。

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

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

scala>def isEqual(x:Int, y:Int) = x == y  isEqual:(Int,Int)Boolean  scala>isEqual(421,421)  res10:Boolean = true scala>def isEqual(x:Any, y:Any) = x == y  isEqual:(Any,Any)Boolean  scala>isEqual(421,421)  res11:Boolean = true

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

scala>val x = "abcd".substring(2)  x:java.lang.String = cd  scala>valy="abcd".substring(2)  y:java.lang.String=cd  scala>x==y  res12:Boolean=true

Java里,x与y的比较结果将是false。程序员在这种情况应该用equals,不过它容易被忘记。

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

scala>val x = new String("abc")  x:java.lang.String = abc  scala>val y = new String("abc")  y:java.lang.String = abc  scala>x == y  res13:Boolean = true scala>x eq y  res14:Boolean = false scala>x ne y  res15:Boolean = true

到此,相信大家对“Scala的原始类型是怎么实现的”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI