Scala創(chuàng)始人致信51CTO:全面解答Scala的泛型優(yōu)勢
原創(chuàng)51CTO開發(fā)頻道最新推薦:Scala編程語言專題
【51CTO獨家特稿】Scala創(chuàng)始人Martin Odersky的訪談錄在51CTO已經(jīng)連續(xù)發(fā)表了一月有余,讀者的反映十分熱烈。訪談中,Martin介紹了很多Scala的設(shè)計理念以及語言特性,對于程序員了解Scala編程語言有著極大的幫助。然而,在很多具體的方面,限于訪談時間與篇幅的關(guān)系,Martin并沒能夠給予足夠的解釋。為此,51CTO的編輯于近日致電郵向其詢問,并很快得到了來自Martin的回信。信件包括幾個方面的內(nèi)容,本文主要介紹有關(guān)Scala泛型方面的。
在第一篇訪談中,Martin講到了他在設(shè)計Java泛型時遇到的約束,而正是Java的約束性令Martin產(chǎn)生了創(chuàng)建一個超越Java的新語言的念頭,并最終因此產(chǎn)生了Scala編程語言。而在之后有關(guān)Scala的類型系統(tǒng)部分中,Martin解釋道,“Scala像Java一樣,使用泛型擦除模式(erasure),所以當程序運行時,我們不再能看到類型參數(shù)。這是為了能與Java互用而進行的設(shè)計”。另外,51CTO的編輯也在其他Scala的用戶那里看到這樣的疑問,說“聽說Scala在泛型上超越了Java,但具體是哪些方面,我也搞不清楚?!睘榇?,郵件中的問題之一就是:
具體來說,Scala在泛型上有哪些方面比Java更加好用呢?
以下是Martin Odersky的回答:
首先是Arrays。Scala中的array可以取泛型參數(shù)(parameterized types)以及類型變量(type variables)來做其元素的類型。這兩項在Scala中是可能的,但在Java中是不可能完成的:
- val xs = new Array[List[Int]](leng)
- val ys = new Array[T](len) // 這里的T是類型變量
我在Java泛型中感到最煩人的缺點之一就是array泛型的缺乏。要實現(xiàn)array的泛型,必要的步驟就是讓array變成非變量(non-variant)。Java無法做到這一點,這是因為其向后兼容的關(guān)系。但是,Scala可以做到。
第二,對基本類型(primitive types)的支持。上面給出的兩行代碼已經(jīng)顯示出基本類型可以被當做類型參數(shù)(type parameters)來使用。
第三,聲明地點可變性(declaration site variance)。對于類型協(xié)變量(types covariant)以及逆變量(contravariant)聲明的支持,將極大的改進絕大多數(shù)庫的一致性。
第四,對于上下邊界的支持(lower bound & upper bound),以及將多個上邊界(multiple upper bonds)做為復合類型(compound type)模式的支持。
我相信,具體化(reification)的缺乏可以通過manifests類來充分解決。Manifests類型現(xiàn)在在Scala中還正在設(shè)計中。具體化經(jīng)常被描述成一切泛型問題的萬靈藥,但它不是。還有就是,擁有泛型的成功的語言中,比如Haskell,ML或OCaml中,都在使用泛型擦除模式(erasure),所以(Scala中)使用這個模式并非只是為了向Java妥協(xié)而設(shè)計。
有關(guān)Scala的泛型就先介紹到這里。51CTO在未來將繼續(xù)帶來新的有關(guān)Scala編程語言的各種新消息,介紹,教程,以及各種你想知道的關(guān)于Scala的內(nèi)容。對于Java開發(fā)人員而言,Scala的學習曲線可以說是微乎其微,而且潛力也相當可觀。如果對Scala語言感興趣,歡迎繼續(xù)關(guān)注51CTO的Scala編程語言專題。
【51CTO.COM 獨家特稿,轉(zhuǎn)載請注明出處及作者!】
【相關(guān)閱讀】