freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

java泛型-java參數(shù)化類型-資料下載頁

2025-08-18 16:23本頁面
  

【正文】 TwoD(18, 4), new TwoD(1, 23) }。 CoordsTwoD tdlocs = new CoordsTwoD(td)。 (Contents of tdlocs.)。 showXY(tdlocs)。 FourD fd[] = { new FourD(1, 2, 3, 4), new FourD(6, 8, 14, 8), new FourD(22, 9, 4, 9), new FourD(3, 2, 23, 17) }。 CoordsFourD fdlocs = new CoordsFourD(fd)。 (Contents of fdlocs.)。 showXY(fdlocs)。 showXYZ(fdlocs)。 showAll(fdlocs)。 }}注意:多個泛型類、接口,接口、類繼承,這種設(shè)計方式往往會導(dǎo)致泛型很復(fù)雜,程序的可讀性急劇下降,程序中應(yīng)該兼顧代碼的可讀性。 總結(jié): 泛型其實就是一個類型的參數(shù)化,沒有它程序照樣寫!把這句話記心里。有兩層含義:一是泛型的實質(zhì),二是要知其然還要知其所以然。泛型不可怕,泛型的設(shè)計也從開發(fā)者角度出發(fā)的,使用得當會大大提高代碼的安全性和簡潔性。資料二:泛型(Generic type 或者 generics)是對 Java 語言的類型系統(tǒng)的一種擴展,以支持創(chuàng)建可以按類型進行參數(shù)化的類??梢园杨愋蛥?shù)看作是使用參數(shù)化類型時指定的類型的一個占位符,就像方法的形式參數(shù)是運行時傳遞的值的占位符一樣??梢栽诩峡蚣埽–ollection framework)中看到泛型的動機。例如,Map 類允許您向一個 Map 添加任意類的對象,即使最常見的情況是在給定映射(map)中保存某個特定類型(比如 String)的對象。因為 () 被定義為返回 Object,所以一般必須將 () 的結(jié)果強制類型轉(zhuǎn)換為期望的類型,如下面的代碼所示:Map m = new HashMap()。(key, blarg)。String s = (String) (key)。要讓程序通過編譯,必須將 get() 的結(jié)果強制類型轉(zhuǎn)換為 String,并且希望結(jié)果真的是一個 String。但是有可能某人已經(jīng)在該映射中保存了不是 String 的東西,這樣的話,上面的代碼將會拋出 ClassCastException。理想情況下,您可能會得出這樣一個觀點,即 m 是一個 Map,它將 String 鍵映射到 String 值。這可以讓您消除代碼中的強制類型轉(zhuǎn)換,同時獲得一個附加的類型檢查層,該檢查層可以防止有人將錯誤類型的鍵或值保存在集合中。這就是泛型所做的工作。一、泛型的好處:Java 語言中引入泛型是一個較大的功能增強。不僅語言、類型系統(tǒng)和編譯器有了較大的變化,以支持泛型,而且類庫也進行了大翻修,所以許多重要的類,比如集合框架,都已經(jīng)成為泛型化的了。這帶來了很多好處:類型安全。 泛型的主要目標是提高 Java 程序的類型安全。通過知道使用泛型定義的變量的類型限制,編譯器可以在一個高得多的程度上驗證類型假設(shè)。沒有泛型,這些假設(shè)就只存在于程序員的頭腦中(或者如果幸運的話,還存在于代碼注釋中)。Java 程序中的一種流行技術(shù)是定義這樣的集合,即它的元素或鍵是公共類型的,比如“String 列表”或者“String 到 String 的映射”。通過在變量聲明中捕獲這一附加的類型信息,泛型允許編譯器實施這些附加的類型約束。類型錯誤現(xiàn)在就可以在編譯時被捕獲了,而不是在運行時當作 ClassCastException 展示出來。將類型檢查從運行時挪到編譯時有助于您更容易找到錯誤,并可提高程序的可靠性。消除強制類型轉(zhuǎn)換。 泛型的一個附帶好處是,消除源代碼中的許多強制類型轉(zhuǎn)換。這使得代碼更加可讀,并且減少了出錯機會。盡管減少強制類型轉(zhuǎn)換可以降低使用泛型類的代碼的羅嗦程度,但是聲明泛型變量會帶來相應(yīng)的羅嗦。比較下面兩個代碼例子。該代碼不使用泛型:List li = new ArrayList()。(new Integer(3))。Integer i = (Integer) (0)。該代碼使用泛型:ListInteger li = new ArrayListInteger()。(new Integer(3))。Integer i = (0)。在簡單的程序中使用一次泛型變量不會降低羅嗦程度。但是對于多次使用泛型變量的大型程序來說,則可以累積起來降低羅嗦程度。 潛在的性能收益。 泛型為較大的優(yōu)化帶來可能。在泛型的初始實現(xiàn)中,編譯器將強制類型轉(zhuǎn)換(沒有泛型的話,程序員會指定這些強制類型轉(zhuǎn)換)插入生成的字節(jié)碼中。但是更多類型信息可用于編譯器這一事實,為未來版本的 JVM 的優(yōu)化帶來可能。 由于泛型的實現(xiàn)方式,支持泛型(幾乎)不需要 JVM 或類文件更改。所有工作都在編譯器中完成,編譯器生成類似于沒有泛型(和強制類型轉(zhuǎn)換)時所寫的代碼,只是更能確保類型安全而已。泛型的許多最佳例子都來自集合框架,因為泛型讓您在保存在集合中的元素上指定類型約束??紤]這個使用 Map 類的例子,其中涉及一定程度的優(yōu)化,即 () 返回的結(jié)果將確實是一個 String:Map m = new HashMap()。(key, blarg)。String s = (String) (key)。如果有人已經(jīng)在映射中放置了不是 String 的其他東西,上面的代碼將會拋出 ClassCastException。泛型允許您表達這樣的類型約束,即 m 是一個將 String 鍵映射到 String 值的 Map。這可以消除代碼中的強制類型轉(zhuǎn)換,同時獲得一個附加的類型檢查層,這個檢查層可以防止有人將錯誤類型的鍵或值保存在集合中。下面的代碼示例展示了 JDK 中集合框架中的 Map 接口的定義的一部分:public interface MapK, V {public void put(K key, V value)。public V get(K key)。}注意該接口的兩個附加物:類型參數(shù) K 和 V 在類級別的規(guī)格說明,表示在聲明一個 Map 類型的變量時指定的類型的占位符。在 get()、put() 和其他方法的方法簽名中使用的 K 和 V。為了贏得使用泛型的好處,必須在定義或?qū)嵗?Map 類型的變量時為 K 和 V 提供具體的值。以一種相對直觀的方式做這件事:MapString, String m = new HashMapString, String()。(key, blarg)。String s = (key)。當使用 Map 的泛型化版本時,您不再需要將 () 的結(jié)果強制類型轉(zhuǎn)換為 String,因為編譯器知道 get() 將返回一個 String。在使用泛型的版本中并沒有減少鍵盤錄入;實際上,比使用強制類型轉(zhuǎn)換的版本需要做更多鍵入。使用泛型只是帶來了附加的類型安全。因為編譯器知道關(guān)于您將放進 Map 中的鍵和值的類型的更多信息,所以類型檢查從執(zhí)行時挪到了編譯時,這會提高可靠性并加快開發(fā)速度。向后兼容:在 Java 語言中引入泛型的一個重要目標就是維護向后兼容。盡管 JDK 的標準類庫中的許多類,比如集合框架,都已經(jīng)泛型化了,但是使用集合類(比如 HashMap 和 ArrayList)的現(xiàn)有代碼將繼續(xù)不加修改地在 JDK 中工作。當然,沒有利用泛型的現(xiàn)有代碼將不會贏得泛型的類型安全好處。二 泛型基礎(chǔ):類型參數(shù):在定義泛型類或聲明泛型類的變量時,使用尖括號來指定形式類型參數(shù)。形式類型參數(shù)與實際類型參數(shù)之間的關(guān)系類似于形式方法參數(shù)與實際方法參數(shù)之間的關(guān)系,只是類型參數(shù)表示類型,而不是表示值。泛型類中的類型參數(shù)幾乎可以用于任何可以使用類名的地方。例如,下面是 接口的定義的摘錄:public interface MapK, V {public void put(K key, V value)。public V get(K key)。}Map 接口是由兩個類型參數(shù)化的,這兩個類型是鍵類型 K 和值類型 V。(不使用泛型)將會接受或返回 Object 的方法現(xiàn)在在它們的方法簽名中使用 K 或 V,指示附加的類型約束位于 Map 的規(guī)格說明之下。當聲明或者實例化一個泛型的對象時,必須指定類型參數(shù)的值:MapString, String map = new HashMapString, String()。注意,在本例中,必須指定兩次類型參數(shù)。一次是在聲明變量 map 的類型時,另一次是在選擇 HashMap 類的參數(shù)化以便可以實例化正確類型的一個實例時。編譯器在遇到一個 MapString, String 類型的變量時,知道 K 和 V 現(xiàn)在被綁定為 String,因此它知道在這樣的變量上調(diào)用 () 將會得到 String 類型。除了異常類型、枚舉或匿名內(nèi)部類以外,任何類都可以具有類型參數(shù)。命名類型參數(shù):推薦的命名約定是使用大寫的單個字母名稱作為類型參數(shù)。這與 C++ 約定有所不同(參閱 附錄 A:與 C++ 模板的比較),并反映了大多數(shù)泛型類將具有少量類型參數(shù)的假定。對于常見的泛型模式,推薦的名稱是:K —— 鍵,比如映射的鍵。 V —— 值,比如 List 和 Set 的內(nèi)容,或者 Map 中的值。 E —— 異常類。 T —— 泛型。泛型不是協(xié)變的:關(guān)于泛型的混淆,一個常見的來源就是假設(shè)它們像數(shù)組一樣是協(xié)變的。其實它們不是協(xié)變的。ListObject 不是 ListString 的父類型。如果 A 擴展 B,那么 A 的數(shù)組也是 B 的數(shù)組,并且完全可以在需要 B[] 的地方使用 A[]:Integer[] intArray = new Integer[10]。 Number[] numberArray = intArray。上面的代碼是有效的,因為一個 Integer 是 一個 Number,因而一個 Integer 數(shù)組是 一個 Number 數(shù)組。但是對于泛型來說則不然。下面的代碼是無效的:ListInteger intList = new ArrayListInteger()。ListNumber numberList = intList。 // invalid最初,大多數(shù) Java 程序員覺得這缺少協(xié)變很煩人,或者甚至是“壞的(broken)”,但是之所以這樣有一個很好的原因。如果可以將 ListInteger 賦給 ListNumber,下面的代碼就會違背泛型應(yīng)該提供的類型安全:ListInteger intList = new ArrayListInteger()。ListNumber numberList = intList。 // invalid(new Float())。因為 intList 和 numberList 都是有別名的,如果允許的話,上面的代碼就會讓您將不是 Integers 的東西放進 intList 中。但是,正如下一屏將會看到的,您有一個更加靈活的方式來定義泛型。類型通配符:假設(shè)您具有該方法:void printList(List l) { for (Object o : l) (o)。 }上面的代碼在 JDK 上編譯通過,但是如果試圖用 ListInteger 調(diào)用它,則會得到警告。出現(xiàn)警告是因為,您將泛型(ListInteger)傳遞給一個只承諾將它當作 List(所謂的原始類型)的方法,這將破壞使用泛型的類型安全。如果試圖編寫像下面這樣的方法,那么將會怎么樣?void printList(ListObject l) { for (Object o : l) (o)。 }它仍然不會通過編譯,因為一個 ListInteger 不是 一個 ListObject(正如前一屏 泛型不是協(xié)變的 中所學(xué)的)。這才真正煩人 —— 現(xiàn)在您的泛型版本還沒有普通的非泛型版本有用!解決方案是使用類型通配符:void printList(List? l) { for (Object o : l) (o)。 }上面代碼中的問號是一個類型通配符。它讀作“問號”。List? 是任何泛型 List 的父類型,所以您完全可以將 ListObject、ListInteger 或 ListListListFlutzpah 傳遞給 printList()。類型通配符的作用:前一屏 類型通配符 中引入了類型通配符,這讓您可以聲明 List? 類型的變量。您可以對這樣的 List 做什么呢?非常方便,可以從中檢索元素,但是不能添加元素。原因不是編譯器知道哪些方法修改列表哪些方法不修改列表,而是(大多數(shù))變化的方法比不變化的方法需要更多的類型信息。下面的代碼則工作得很好:ListInteger li = new ArrayListInteger()。(new Integer(42))。List? lu = li。((0))。為什么該代碼能工作呢?對于 lu,編譯器一點都不知道 List 的類型參數(shù)的值。但是編譯器比較聰明,它可以做一些類型推理。在本例中,它推斷未知的類型參數(shù)必須擴展 Object。(這個特定的推理沒有太大的跳躍,但是編譯器可以作出一些非常令人佩服的類型推理,后面就會看到(在 底層細節(jié) 一節(jié)中)。所以它讓您調(diào)用 () 并推斷返回類型為 Object。另一方面,下面的代碼不能工作:ListInteger li = new ArrayListInteger()。(new Integer(42))。List? lu = li。(new Integer(43))。 // error在本例中,對于 lu,編譯器不能對 List 的類型參數(shù)作出足夠嚴密的推理,以確定將 Integer 傳遞給 () 是類型安全的。所以編譯器將不允許您這么做。以免您仍然認為編譯器知道哪些方法更改列表的內(nèi)容哪些不更改列表內(nèi)容,請注意下面的代碼將能工作,因為它不依賴于編譯器必須知道關(guān)于 lu 的類型參數(shù)的任何信息:ListInteger li = new ArrayListInteger()。(new Integer(42))。List? lu = li。()。泛型方法(在 類型參數(shù) 一節(jié)中)您已經(jīng)看到,通過在類的定義中添加一個形式類型參數(shù)列表,可以將類泛型化。方法也可以被泛型化,不管它們定義在其中的類是不是泛型化的。泛型類在多個方法簽名間實施類型約束。在 ListV 中,類型參數(shù) V 出現(xiàn)在 get()、add()、contains() 等方法的簽名中。當創(chuàng)建一個 MapK, V 類型的變量時,您就在方法之間宣稱一個類型約束。您傳遞給 add() 的值將與 get() 返回的值的類型相同。類似地,之所以聲明泛型方法,一般是因為您想要在該方法的多個參數(shù)之間宣稱一個類型約束。例如,下面代碼中的 ifThenElse() 方法,根據(jù)它的第一個參數(shù)的布爾值,它將返回第二個或第三個參數(shù):public T T ifThenElse(boolean b, T first, T second) {return b ? first : second。}注意,您可以調(diào)用 ifThenElse(),而不用顯式地告訴編譯器,您想要 T 的什么值。編譯器不必顯式地被告知 T 將具有什么值;它只知道這些值都必須相同。編譯器允許您調(diào)用下面的代碼,因為編譯器可以使用類型推理來推斷出,替代 T 的 String 滿足所有的類型約束:String s = ifThenElse(b, a, b)。類似地,您可以調(diào)用:Integer i = ifThenElse(b, new Integer(1), new Integer(2))。但是,編譯器不允許下面的代碼,因為沒有類型會滿足所需的類型約束:String s = ifThenElse(b, pi, new Float())。為什么您選擇使用泛型方法,而不是將類型 T 添加到類定義呢?(至少)有兩種情況應(yīng)該這樣做:當泛型方法是靜態(tài)的時,這種情況下不能使用類類型參數(shù)。當 T 上的類型約束對于方法真正是局部的時,這意味著沒有在相同類的另一個 方法簽名中使用相同 類型 T 的約束。通過使得泛型方法的類型參數(shù)對于方法是局部的,可以簡化封閉類型的簽名。有限制類型:在前一屏 泛型方法 的例子中,類型參數(shù) V 是無約束的或無限制的 類型。有時在還沒有完全指定類型參數(shù)時,需要對類型參數(shù)指定附加的約束??紤]例子 Matrix 類,它使用類型參數(shù) V,該參數(shù)由 Number 類來限制:public class MatrixV extends Number { ... }編譯器允許您創(chuàng)建 MatrixInteger 或 MatrixFloat 類型的變量,但是如果您試圖定義 MatrixString 類型的變量,則會出現(xiàn)錯誤。類型參數(shù) V 被判斷為由 Number 限制 。在沒有類型限制時,假設(shè)類型參數(shù)由 Object 限制。這就是為什么前一屏 泛型方法 中的例子,允許 () 在 List? 上調(diào)用時返回 Object,即使編譯器不知道類型參數(shù) V 的類型。三 一個簡單的泛型類編寫基本的容器類此時,您可以開始編寫簡單的泛型類了。到目前為止,泛型類最常見的用例是容器類(比如集合框架)或者值持有者類(比如 WeakReference 或 ThreadLocal)。我們來編寫一個類,它類似于 List,充當一個容器。其中,我們使用泛型來表示這樣一個約束,即 Lhist 的所有元素將具有相同類
點擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1