Scala的泛型:最強大的特性
51CTO編輯推薦:Scala編程語言專題
8 Scala的泛型
我們在這文章將要學習Scala的最后一個特性是泛型。Java程序員們可能最近才知道這個東西,因為這個特性是在Java1.5中才被加入的。
泛型是一種可以讓你使用類型參數的設施。例如當一個程序員正在實現一個鏈表時,將不得不面對諸如如何決定鏈表中節點保存數據的類型之類的問題。正由于這是一個鏈表,所以往往會在不同的環境中使用,因此,我們不能草率的決定節點數據類型,比如說Int。這種決定是相當的草率且局限性的。
以前Java程序員們通常使用Object,所有類型的超類,來解決問題。但是這種方法遠遠算不上是理想方案,例如他無法處理基本類型如int、long、float等(1.6中的autobox特性可以解決這個問題——譯者注),而且會讓使用者不得不使用大量的動態類型轉換。
Scala中的泛型機制可以很輕松的解決這些個問題。來看下面這個最簡單的容器類:一個引用,可以指向某個對象或者指向空。
class Reference[T] {
private var contents: T = _
def set(value: T) { contents = value }
def get: T = contents
}
Reference類具有一個叫做T的類型參數來表示他說引用的對象的類型。這個類型在Reference中作為了變量和函數的參數或者返回類型。
上面的代碼還演示了Scala中變量的表達方式,這個無需更多的解釋大家都能清楚。不過值得注意的是我們給他賦予的初始值:_ ,這個表示一個默認值,對于數字類型來說是0,對于boolean來說是false,對于Unit(函數簽名)來說是() (無參數無返回),對于其他來說是null。
要使用這個Reference 類,你需要制定他的類型參數,來告知這個引用到底引用了什么類型。例如要創建一個指向Int的引用,你可以這么寫:
object IntegerReference {
def main(args: Array[String]) {
val cell = new Reference[Int] cell.set(13)
println("Reference contains the half of " + (cell.get * 2))
}
}
就像我們看到的,我們不需要吧get的返回值強制轉換成Int,而且由于它被聲明成Int,你不可能在這個引用中放置其他類型的對象。
本文簡要介紹了Scala語言的一些特性,并且同時展示了若干實例。有興趣的讀者可以繼續閱讀本文的姊妹篇:《Scala By Example》,該文覆蓋了Scala的更多的高級特性。如果需要還可以去閱讀《Scala Language Specification》。
【相關閱讀】