鍍金池/ 教程/ Scala/ Scala 基本數(shù)據(jù)類型的實現(xiàn)方法
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動態(tài)綁定
Trait 的基本概念
if 表達式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實現(xiàn)方法
try 表達式處理異常
選擇瘦接口還是胖接口設(shè)計?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實現(xiàn)可疊加的修改操作

Scala 基本數(shù)據(jù)類型的實現(xiàn)方法

Scala 的基本數(shù)據(jù)類型是如何實現(xiàn)的?實際上,Scala 以與 Java 同樣的方式存儲整數(shù):把它當作 32 位的字類型。這對于有效使用 JVM 平臺和與 Java 庫的互操作性方面來說都很重要。標準的操作如加法或乘法都被實現(xiàn)為數(shù)據(jù)類型基本運算操作。然而,當整數(shù)需要被當作(Java)對象看待的時候,Scala 使用了“備份”類 java.lang.Integer。如在整數(shù)上調(diào)用 toString 方法或者把整數(shù)賦值給 Any 類型的變量時,就會這么做,需要的時候,Int 類型的整數(shù)能自動轉(zhuǎn)換為 java.lang.Integer 類型的“裝箱整數(shù)(boxed integer)”。

這些聽上去和 Java 的 box 操作很像,實際上它們也很像,但這里有一個重要的差異,Scala 使用 box 操作比在 Java 中要少的多:

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

你當然會得到 true?,F(xiàn)在,把 isEqual 的參數(shù)類型變?yōu)閖 ava.lang.Integer(或 Object,結(jié)果都一樣):

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

你會發(fā)現(xiàn)你得到了 false!原因是數(shù) 421 使用”box”操作了兩次,由此參數(shù) x 和 y 是兩個不同的對象,因為在引用類型上==表示引用相等,而 Intege r是引用類型,所以結(jié)果是 false。這是展示了 Java 不是純面向?qū)ο笳Z言的一個方面。我們能清楚觀察到基本數(shù)據(jù)值類型和引用類型之間的差別。

現(xiàn)在在 Scala 里嘗試同樣的實驗:

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

Scala 的 == 設(shè)計出自動適應(yīng)變量類型的操作,對值類型來說,就是自然的(數(shù)學或布爾)相等。對于引用類型,==被視為繼承自 Objec t的 equals 方法的別名。比如對于字符串比較:

scala> val x = "abcd".substring(2)
x: String = cd
scala> val y = "abcd".substring(2)
y: String = cd
scala> x==y
res0: Boolean = true

而在 Java 里,x 與 y 的比較結(jié)果將是 false。程序員在這種情況應(yīng)該用 equals,不過它容易被忘記。

然而,有些情況你需要使用引用相等代替用戶定義的相等。例如,某些時候效率是首要因素,你想要把某些類哈希合并: hash cons 然后通過引用相等比較它們的實例,為這種情況,類 AnyRef 定義了附加的 eq 方法,它不能被重載并且實現(xiàn)為引用相等(也就是說,它表現(xiàn)得就像 Java 里對于引用類型的==那樣)。同樣也有一個 eq 的反義詞,被稱為 ne。例如:

scala> val x =new String("abc")
x: String = abc
scala> val y = new String("abc")
y: String = abc
scala> x == y
res0: Boolean = true
scala> x eq y
res1: Boolean = false
scala> x ne y
res2: Boolean = true