这些都是怎么实现的?实际上,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
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, scala
, 类型
, integer
, 整数
, 装箱
, java整数
原始类型
scala 类型转换、scala强制类型转换、scala 数据类型、scala unit类型、scala any 类型转换,以便于您获取更多的相关知识。