成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala的原始類型是如何實現的

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第十一章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

這些都是怎么實現的?實際上,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?,F在,把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
責任編輯:book05 來源: Artima
相關推薦

2021-06-09 07:55:19

Typescript類型檢查

2009-07-22 09:08:09

Scalaabove方法

2021-06-05 21:30:24

typescriptOverride檢查

2009-06-10 09:29:40

Scala類型通配符

2009-08-13 10:35:05

Scala數組排序

2011-11-03 16:32:57

Dart

2024-11-05 15:02:41

2009-06-03 09:08:20

ScalaJava類型

2009-07-21 09:31:00

Scala基本類型文本

2022-04-17 09:18:11

響應式數據Vue.js

2011-07-11 14:36:05

JAVA

2021-09-17 12:50:10

MySQL數據庫ACID

2023-12-26 01:07:03

TCP擁塞控制

2022-05-16 08:22:37

零拷貝Netty

2009-07-09 00:25:00

Scala參數化

2020-10-31 17:33:18

Scala語言函數

2022-07-18 23:49:19

區塊鏈民主數據

2009-07-08 12:43:59

Scala ServlScala語言

2009-07-22 07:49:00

Scala控制結構

2019-01-22 15:26:48

APP會員自動續費簽約
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 网络毛片| 色婷婷综合久久久久中文一区二区 | 999热视频| 国产精品一区二区三区久久久 | 久草.com | 少妇无套高潮一二三区 | 色综合久久久久 | 中文字幕视频一区 | 一区二区亚洲 | 中文字幕高清av | 日本福利视频 | 久久久久久国产精品免费免费 | 欧美日韩电影一区二区 | 亚洲成人免费av | 欧美日韩一区二区三区视频 | 国产欧美日韩一区 | www.国产一区 | 日韩精品在线免费 | 国产欧美一区二区三区久久 | 九九av | 中文字幕亚洲精品 | 青青草原综合久久大伊人精品 | 欧美在线一区二区三区 | 香蕉久久av | 久久久成人动漫 | 成人国产精品免费观看 | www.亚洲精品| 国产美女一区二区三区 | 精品一区二区三区免费视频 | 91久久久www播放日本观看 | 久久精品高清视频 | 九九热视频这里只有精品 | 羞羞的视频网站 | 日韩欧美大片在线观看 | 日韩三级 | 欧美综合国产精品久久丁香 | 狠狠视频 | 精品自拍视频在线观看 | 毛片免费在线 | 亚洲一二三在线 | 麻豆国产一区二区三区四区 |