Scala的泛型:最強(qiáng)大的特性
51CTO編輯推薦:Scala編程語言專題
8 Scala的泛型
我們?cè)谶@文章將要學(xué)習(xí)Scala的最后一個(gè)特性是泛型。Java程序員們可能最近才知道這個(gè)東西,因?yàn)檫@個(gè)特性是在Java1.5中才被加入的。
泛型是一種可以讓你使用類型參數(shù)的設(shè)施。例如當(dāng)一個(gè)程序員正在實(shí)現(xiàn)一個(gè)鏈表時(shí),將不得不面對(duì)諸如如何決定鏈表中節(jié)點(diǎn)保存數(shù)據(jù)的類型之類的問題。正由于這是一個(gè)鏈表,所以往往會(huì)在不同的環(huán)境中使用,因此,我們不能草率的決定節(jié)點(diǎn)數(shù)據(jù)類型,比如說Int。這種決定是相當(dāng)?shù)牟萋是揖窒扌缘摹?
以前Java程序員們通常使用Object,所有類型的超類,來解決問題。但是這種方法遠(yuǎn)遠(yuǎn)算不上是理想方案,例如他無法處理基本類型如int、long、float等(1.6中的autobox特性可以解決這個(gè)問題——譯者注),而且會(huì)讓使用者不得不使用大量的動(dòng)態(tài)類型轉(zhuǎn)換。
Scala中的泛型機(jī)制可以很輕松的解決這些個(gè)問題。來看下面這個(gè)最簡(jiǎn)單的容器類:一個(gè)引用,可以指向某個(gè)對(duì)象或者指向空。
class Reference[T] {
private var contents: T = _
def set(value: T) { contents = value }
def get: T = contents
}
Reference類具有一個(gè)叫做T的類型參數(shù)來表示他說引用的對(duì)象的類型。這個(gè)類型在Reference中作為了變量和函數(shù)的參數(shù)或者返回類型。
上面的代碼還演示了Scala中變量的表達(dá)方式,這個(gè)無需更多的解釋大家都能清楚。不過值得注意的是我們給他賦予的初始值:_ ,這個(gè)表示一個(gè)默認(rèn)值,對(duì)于數(shù)字類型來說是0,對(duì)于boolean來說是false,對(duì)于Unit(函數(shù)簽名)來說是() (無參數(shù)無返回),對(duì)于其他來說是null。
要使用這個(gè)Reference 類,你需要制定他的類型參數(shù),來告知這個(gè)引用到底引用了什么類型。例如要?jiǎng)?chuàng)建一個(gè)指向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的返回值強(qiáng)制轉(zhuǎn)換成Int,而且由于它被聲明成Int,你不可能在這個(gè)引用中放置其他類型的對(duì)象。
本文簡(jiǎn)要介紹了Scala語言的一些特性,并且同時(shí)展示了若干實(shí)例。有興趣的讀者可以繼續(xù)閱讀本文的姊妹篇:《Scala By Example》,該文覆蓋了Scala的更多的高級(jí)特性。如果需要還可以去閱讀《Scala Language Specification》。
【相關(guān)閱讀】