15泛型_15.1與C++比較

第15章 泛型

一般的類和方法。只能使用具體的類型:要麼是基本類型。要麼是自定義的類。如果要編寫可以應用於多種類型的代碼。這種刻板的限制對代碼的束縛就會很大。

在面向對象編程語言中,多態算是一種泛化機制。例如,你可以將方法的參數類型設爲基類,那麼該方法就可以接受從這個基類中導出的任何類作爲參數。這樣的方法更加通用一些,可應用的地方也多一些。在類的內部也是如此,凡是需要說明類型的地方,如果都使用基類,確實能夠良備更好的靈活性。但是,考慮到除了final類不能擴展,其他任何類都可以被擴展,所以這種靈活性大多數時候也會有一些性能損耗。

有時候,拘泥於單繼承體系,也會使程序受限太多。如果方法的參數是一個接口,而不是一個類,這種限制就放鬆了許多。因爲任何實現了該接口的類都能夠滿足該方法,這也包括暫時還不存在的類。這就給予客戶端程序員一種選擇,他可以通過實現一個接口來滿足類或方法。因此,接口允許我們快捷地實現類繼承,也使我們有機會創建一個新類來做到這一點。

可是有的時候,即便使用了接口,對程序的約束也還是太強了。因爲一旦指明瞭接口,它就要求你的代碼必須使用特定的接口。而我們希望達到的目的是編寫更通用的代碼,要使代碼能夠應用於“某種不具體的類型”,而不是一個具體的接口或類。

這就是Java SE5的重大變化之一:泛型的概念。泛型實現了參數化類型的概念,使代碼可以應用於多種類型。“泛型“這個術語的意思是:“適用於許多許多的類型’。泛型在編程語言中出現時,其最初的目的是希望類或方法能夠具備最廣泛的表達能力。如何做到這一點呢,正是通過解耦類或方法與所使用的類型之間的約束。稍後你將看到,Java中的泛型並沒有這麼高的追求,實際上,你可能會質疑,Java中的術語“泛型”是否適合用來描述這一功能。

如果你從未接觸過參數化類型機制,那麼,在學習了Java中的泛型之後,你會發現,對這門語言而言,泛型確實是一個很有益的補充。在你創建參數化類型的一個實例時,編譯器會爲你負責轉型操作,並且保證類型的正確性。這應該是一個進步。

然而,如果你瞭解其他語言(例如C++)中的參數化類型機制,你就會發現。有些以前能做到的事情,使用Java的泛型機制卻無法做到。使用別人已經構建好的泛型類型會相當容易,但是如果你要自己創建一個泛型實例,就會遇到許多令你吃驚的事情。在本章中,我的任務之一就是向你解釋,Java中的泛型是怎樣發展成現在這樣的。

這並非是說Java的泛型毫無用處。在很多情況下,它們可以使代碼更直接更優雅。不過,如果你具備其他語言的經驗,而那種語言實現了更純粹的泛型,那麼,Java可能令你失望了。在本章中,我們會介紹Java泛型的優點與侷限,希望這能夠幫助你更有效地使用Java的這個新功能。

15.1 與C++的比較

Java的設計者曾說過,設計這門語言的靈感主要來自C++。儘管如此,學習Java時,基本上可以不用參考C++。我也是盡力這樣做的,除非,與C++的比較能夠加深你的理解。

Java中的泛型就需要與C++進行一番比較,理由有二:
- 首先,丁解C++模板的某些方面,有助於你理解泛型的基礎。同時,非常重要的一點是,你可以瞭解Java泛型的侷限是什麼,以及爲什麼會有這些限制。最終的目的是幫助你理解,Java泛型的邊界在哪裏。理解了邊界所在,你才能成爲程序高手。因爲只有知道了某個技術不能做到什麼,你才能更好地做到所能做的(部分原因是,不必浪費時間在死衚衕裏亂轉)。
- 第二個原因是,在Java社區中,人們普遍時C++摸板有一種誤解,而這種誤解可能會誤導你令你在理解泛型的意圖時產生偏差。

因此,在本章中會介紹一些C++模板的例子,不過我也會盡量控制它們的篇幅。

發佈了39 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章