Java 泛型知識點

2021-08-03 03:56:14 字數 1725 閱讀 9260

1、在你建立引數化型別的乙個例項時,編譯器會為你負責轉型操作,並且保證型別的正確性。泛型的主要目的之一就是用來指定容器要持有什麼型別的物件,而且由編譯器來保證型別的正確性。示例:

public class holder

class orange extends fruit{}

fruit[1] = new jonathan();//ok

fruit[2] = new fruit();//complier allows you to add fruit,but in runtime you will get a arraystoreexception

對陣列的這種賦值並不是那麼可怕,因為在執行時可以發現你已經插入了不正確的型別。但是,泛型的主要目標之一是將這種錯誤檢測移入到編譯期。因此,當我們檢視使用泛型容器代替陣列的時候,會發生什麼?

與陣列不同,泛型沒有內建的協変型別。這是因為陣列在語言中是完全定義的,因此內建了編譯期和執行時的檢查,但是在使用泛型時,編譯器和執行時系統都不知道你想用什麼型別做些什麼,以及應該採用什麼樣的規則。

但是,有時你想要在兩個型別之間建立某種型別的向上轉型關係,這正是萬用字元所允許的。

//complie error

flist.add(new fruit());

flist.add(new object());

萬用字元引用的是明確的型別,你無法向flist放置任何乙個物件,因為一旦執行這種型別的向上轉型,你就將丟失掉向其中傳遞任何物件的能力,甚至是傳遞object都不行。

fruit f = flist.get(0);

如上**是安全的,因為這個list中的任何物件至少具有fruit型別,因此編譯器允許這麼做。

11、超型別萬用字元

<? super myclass>可以宣告萬用字元是由某個特定類的任何基類來界定的,甚至可以使用型別引數:<?super t>(儘管你不能對泛型引數給出乙個超型別邊界:即不能宣告)。這使得你可以安全的傳遞乙個型別物件到泛型型別中。因此,有了超型別萬用字元就可以向集合中寫入了:

捕獲轉換:

有一種情況特別需要使用<?>而不是原生型別。如果向乙個使用<?>的方法傳遞原生型別,那麼對編譯器來說,可能會推斷出實際的型別引數,使得這個方法可以迴轉並呼叫另乙個使用這個確切型別的方法。這種技術被稱為「捕獲轉換」;

public class captureconversion

這會強制要求將正在定義的類當做引數傳遞給基類。

示例:class selfbounded>

class a extends selfbounded{}

class b extends selfbounded{}//also ok

class d{}

class e extends selfbounds{}//complie error:d 不是自限定型別

自限定的引數的意義是什麼呢?它可以保證型別引數必須與正在被定義的類相同。還有,自限定限制只能強制作用於繼承關係。還可以將自限定用於泛型方法。

14、由於擦除的原因,將泛型應用於異常是非常受限的。catch語句不能捕獲泛型型別的異常。因為在編譯期和執行時都必須知道異常的確切型別。泛型類也不能直接或間接繼承自throwable。但是,型別引數可能會在乙個方法的throws子句中用到。這使得你可以編寫隨檢查型異常的型別而發生變化的泛型**:

inte***ce processor{

void process(listresult) throws e;

processor執行process(),並且可能會丟擲具有型別e的異常。

C 知識點(6)泛型

為什麼需要泛型 編寫程式的時候容易遇到兩個模組功能相近但是引數型別不同,所以分別寫多個方法處理每種資料型別,不能重用同樣功能的 用根類object來解決存在的缺陷 a 會出現裝箱和拆箱的操作,將會在託管堆上分配和 大量的變數,如果數量龐大,效能會損失嚴重。b 雖然處理引用型別,沒有裝箱和拆箱的操作,...

泛型知識點整理

泛型好處 1 將執行時期的問題classcastexception轉到了編譯時期 2 避免了強制轉換的麻煩 什麼時候用 當操作的引用資料型別不確定的時候,使用 泛型擦除 執行時,會將泛型去掉,生產的class檔案中是不帶泛型的,這個稱為泛型的擦除。泛型補償 執行時,通過獲取元素的型別進行轉換動作,不...

黑馬程式設計師 泛型知識點 總結

asp.net android ios開發 net培訓 期待與您交流!1.泛型,為了適應通用程式設計,我們可以使用型別引數,利用特定的型別,定義我們需要的類。泛型就是乙個抽象層,是型別的模板,用它定義具體的型別,才能例項化對外.2.c 提供5種泛型 類 結構 介面 委託和方法。注意前面4個是型別,而...