Scala 基本數據類型的實現方法

2018-08-12 21:25 更新

Scala 基本數據類型的實現方法

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

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

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

你當然會得到 true。現在,把 isEqual 的參數類型變?yōu)閖 ava.lang.Integer(或 Object,結果都一樣):

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

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

現在在 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 的 == 設計出自動適應變量類型的操作,對值類型來說,就是自然的(數學或布爾)相等。對于引用類型,==被視為繼承自 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 的比較結果將是 false。程序員在這種情況應該用 equals,不過它容易被忘記。

然而,有些情況你需要使用引用相等代替用戶定義的相等。例如,某些時候效率是首要因素,你想要把某些類哈希合并: hash cons 然后通過引用相等比較它們的實例,為這種情況,類 AnyRef 定義了附加的 eq 方法,它不能被重載并且實現為引用相等(也就是說,它表現得就像 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
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號