国产精品尤物福利片在线观看_少妇免费毛片久久久久久久久_久久久久成人精品免费播放动漫_日韩av综合在线观看

歡迎來到010在線作文網!

Java泛型總結報告

工作計劃 時間:2021-08-31 手機版

Java泛型總結報告精選

  篇一:Java泛型總結

  1. 什么是泛型?

  泛型(Generic type 或者 generics)是對 Java 語言的類型系統的一種擴展,以支持創建可以按類型進行參數化的類。可以把類型參數看作是使用參數化類型時指定的類型的一個占位符,就像方法的形式參數是運行時傳遞的值的占位符一樣。

  可以在集合框架(Collection framework)中看到泛型的動機。例如,Map 類允許您向一個 Map 添加任意類的對象,即使最常見的情況是在給定映射(map)中保存某個特定類型(比如 String)的對象。

  因為 Map.get() 被定義為返回 Object,所以一般必須將 Map.get() 的結果強制類型轉換為期望的類型,如下面的代碼所示:

  Map m = new HashMap();

  m.put("key", "blarg");

  String s = (String) m.get("key");

  要讓程序通過編譯,必須將 get() 的結果強制類型轉換為 String,并且希望結果真的是一個 String。但是有可能某人已經在該映射中保存了不是 String 的東西,這樣的話,上面的代碼將會拋出 ClassCastException。

  理想情況下,您可能會得出這樣一個觀點,即 m 是一個 Map,它將 String 鍵映射到 String 值。這可以讓您消除代碼中的強制類型轉換,同時獲得一個附加的類型檢查層,該檢查層可以防止有人將錯誤類型的鍵或值保存在集合中。這就是泛型所做的工作。

  2. 泛型的好處

  Java 語言中引入泛型是一個較大的功能增強。不僅語言、類型系統和編譯器有了較大的變化,以支持泛型,而且類庫也進行了大翻修,所以許多重要的類,比如集合框架,都已經成為泛型化的了。這帶來了很多好處:

  類型安全。 泛型的主要目標是提高 Java 程序的類型安全。通過知道使用泛型定義的變量的類型限制,編譯器可以在一個高得多的程度上驗證類型假設。沒有泛型,這些假設就只存在于程序員的頭腦中(或者如果幸運的話,還存在于代碼注釋中)。

  Java 程序中的一種流行技術是定義這樣的集合,即它的元素或鍵是公共類型的,比如“String 列表”或者“String 到 String 的映射”。通過在變量聲明中捕獲這一附加的類型信息,泛型允許編譯器實施這些附加的類型約束。類型錯誤現在就可以在編譯時被捕獲了,而不是在運行時當作 ClassCastException 展示出來。將類型檢查從運行時挪到編譯時有助于您更容易找到錯誤,并可提高程序的可靠性。

  消除強制類型轉換。 泛型的一個附帶好處是,消除源代碼中的許多強制類型轉換。這使得代碼更加可讀,并且減少了出錯機會。

  盡管減少強制類型轉換可以降低使用泛型類的代碼的羅嗦程度,但是聲明泛型變量會帶來相應的羅嗦。比較下面兩個代碼例子。

  該代碼不使用泛型:

  List li = new ArrayList();

  li.put(new Integer(3));

  Integer i = (Integer) li.get(0);

  該代碼使用泛型:

  Listli = new ArrayList();

  li.put(new Integer(3));

  Integer i = li.get(0);

  在簡單的程序中使用一次泛型變量不會降低羅嗦程度。但是對于多次使用泛型變量的大型程序來說,則可以累積起來降低羅嗦程度。

  潛在的性能收益。 泛型為較大的優化帶來可能。在泛型的初始實現中,編譯器將強制類型轉換(沒有泛型的話,程序員會指定這些強制類型轉換)插入生成的字節碼中。但是更多類型信息可用于編譯器這一事實,為未來版本的 JVM 的優化帶來可能。

  由于泛型的實現方式,支持泛型(幾乎)不需要 JVM 或類文件更改。所有工作都在編譯器中完成,編譯器生成類似于沒有泛型(和強制類型轉換)時所寫的代碼,只是更能確保類型安全而已。

  3. 泛型用法的例子

  泛型的許多最佳例子都來自集合框架,因為泛型讓您在保存在集合中的元素上指定類型約束。考慮這個使用 Map 類的例子,其中涉及一定程度的優化,即 Map.get() 返回的結果將確實是一個 String:

  Map m = new HashMap();

  m.put("key", "blarg");

  String s = (String) m.get("key");

  如果有人已經在映射中放置了不是 String 的其他東西,上面的代碼將會拋出 ClassCastException。泛型允許您表達這樣的類型約束,即 m 是一個將 String 鍵映射到 String 值的 Map。這可以消除代碼中的強制類型轉換,同時獲得一個附加的類型檢查層,這個檢查層可以防止有人將錯誤類型的鍵或值保存在集合中。

  下面的代碼示例展示了 JDK 5.0 中集合框架中的 Map 接口的定義的一部分:

  public interface Map{

  public void put(K key, V value);

  public V get(K key);

  }

  注意該接口的兩個附加物:

  類型參數 K 和 V 在類級別的規格說明,表示在聲明一個 Map 類型的變量時指定的.類型的占位符。

  在 get()、put() 和其他方法的方法簽名中使用的 K 和 V。

  為了贏得使用泛型的好處,必須在定義或實例化 Map 類型的變量時為 K 和 V 提供具體的值。以一種相對直觀的方式做這件事:

  Mapm = new HashMap();

  m.put("key", "blarg");

  String s = m.get("key");

  當使用 Map 的泛型化版本時,您不再需要將 Map.get() 的結果強制類型轉換為 String,因為編譯器知道 get() 將返回一個 String。

  在使用泛型的版本中并沒有減少鍵盤錄入;實際上,比使用強制類型轉換的版本需要做更多鍵入。使用泛型只是帶來了附加的類型安全。因為編譯器知道關于您將放進 Map 中的鍵和值的類型的更多信息,所以類型檢查從執行時挪到了編譯時,這會提高可靠性并加快開發速度。

  向后兼容

  在 Java 語言中引入泛型的一個重要目標就是維護向后兼容。盡管 JDK 5.0 的標準類庫中的許多類,比如集合框架,都已經泛型化了,但是使用集合類(比如 HashMap 和 ArrayList)的現有代碼將繼續不加修改地在 JDK 5.0 中工作。當然,沒有利用泛型的現有代碼將不會贏得泛型的類型安全好處。

  4. 泛型基礎

  4.1 類型參數

  在定義泛型類或聲明泛型類的變量時,使用尖括號來指定形式類型參數。形式類型參數與實際類型參數之間的關系類似于形式方法參數與實際方法參數之間的關系,只是類型參數表示類型,而不是表示值。

  泛型類中的類型參數幾乎可以用于任何可以使用類名的地方。例如,下面是 java.util.Map 接口的定義的摘錄:

  public interface Map{

  public void put(K key, V value);

  public V get(K key);

  }

  Map 接口是由兩個類型參數化的,這兩個類型是鍵類型 K 和值類型 V。(不使用泛型)將會接受或返回 Object 的方法現在在它們的方法簽名中使用 K 或 V,指示附加的類型約束位于 Map 的規格說明之下。

  當聲明或者實例化一個泛型的對象時,必須指定類型參數的值:

  Mapmap = new Ha

  shMap();

  注意,在本例中,必須指定兩次類型參數。一次是在聲明變量 map 的類型時,另一次是在選擇 HashMap 類的參數化以便可以實例化正確類型的一個實例時。

  編譯器在遇到一個 Map類型的變量時,知道 K 和 V 現在被綁定為 String,因此它知道在這樣的變量上調用 Map.get() 將會得到 String 類型。

  除了異常類型、枚舉或匿名內部類以外,任何類都可以具有類型參數。

  4.2 命名類型參數

  推薦的命名約定是使用大寫的單個字母名稱作為類型參數。這與 C++ 約定有所不同(參閱 附錄 A:與 C++ 模板的比較),并反映了大多數泛型類將具有少量類型參數的假定。對于常見的泛型模式,推薦的名稱是:

  K —— 鍵,比如映射的鍵。

  V —— 值,比如 List 和 Set 的內容,或者 Map 中的值。

  E —— 異常類。

  T —— 泛型。

  4.3 泛型不是協變的

  關于泛型的混淆,一個常見的來源就是假設它們像數組一樣是協變的。其實它們不是協變的。List

  不是 List的父類型。

  如果 A 擴展 B,那么 A 的數組也是 B 的數組,并且完全可以在需要 B[] 的地方使用 A[]:

  Integer[] intArray = new Integer[10];

  Number[] numberArray = intArray;

  上面的代碼是有效的,因為一個 Integer 是一個 Number,因而一個 Integer 數組是 一個 Number 數組。但是對于泛型來說則不然。下面的代碼是無效的:

  ListintList = new ArrayList();

  ListnumberList = intList; // invalid

  最初,大多數 Java 程序員覺得這缺少協變很煩人,或者甚至是“壞的(broken)”,但是之所以這樣有一個很好的原因。如果可以將 List賦給 List,下面的代碼就會違背泛型應該提供的類型安全:

  ListintList = new ArrayList();

  ListnumberList = intList; // invalid

  numberList.add(new Float(3.1415));

  因為 intList 和 numberList 都是有別名的,如果允許的話,上面的代碼就會讓您將不是 Integers 的東西放進 intList 中。但是,正如下一屏將會看到的,您有一個更加靈活的方式來定義泛型。

  4.4 類型通配符

  假設您具有該方法:

  void printList(List l) {

  for (Object o : l)

  System.out.println(o);

  }

  上面的代碼在 JDK 5.0 上編譯通過,但是如果試圖用 List調用它,則會得到警告。出現警告是因為,您將泛型(List)傳遞給一個只承諾將它當作 List(所謂的原始類型)的方法,這將破壞使用泛型的類型安全。

  如果試圖編寫像下面這樣的方法,那么將會怎么樣?

  void printList(List

  l) {

  for (Object o : l)

  System.out.println(o);

  }

  它仍然不會通過編譯,因為一個 List不是 一個 List

  (正如前一屏 泛型不是協變的 中所學的)。這才真正煩人 —— 現在您的泛型版本還沒有普通的非泛型版本有用!

  解決方案是使用類型通配符:

  void printList(List l) {

  for (Object o : l)

  System.out.println(o);

  }

  上面代碼中的問號是一個類型通配符。它讀作“問號”。List 是任何泛型 List 的父類型,所以您完全可以將 List

  、List或 List<List> 傳遞給 printList()。

  4.5 類型通配符的作用

  類型通配符中引入了類型通配符,這讓您可以聲明 List 類型的變量。您可以對這樣的 List 做什么呢?非常方便,可以從中檢索元素,但是不能添加元素。原因不是編譯器知道哪些方法修改列表哪些方法不修改列表,而是(大多數)變化的方法比不變化的方法需要更多的類型信息。下面的代碼則工作得很好:

  Listli = new ArrayList();

  li.add(new Integer(42));

  List lu = li;

  System.out.println(lu.get(0));

  為什么該代碼能工作呢?對于 lu,編譯器一點都不知道 List 的類型參數的值。但是編譯器比較聰明,它可以做一些類型推理。在本例中,它推斷未知的類型參數必須擴展 Object。(這個特定的推理沒有太大的跳躍,但是編譯器可以作出一些非常令人佩服的類型推理,后面就會看到(在底層細節一節中)。所以它讓您調用 List.get() 并推斷返回類型為 Object。 另一方面,下面的代碼不能工作:

  Listli = new ArrayList();

  li.add(new Integer(42));

  List lu = li;

  lu.add(new Integer(43)); // error

  在本例中,對于 lu,編譯器不能對 List 的類型參數作出足夠嚴密的推理,以確定將 Integer 傳遞給 List.add() 是類型安全的。所以編譯器將不允許您這么做。

  以免您仍然認為編譯器知道哪些方法更改列表的內容哪些不更改列表內容,請注意下面的代碼將能工作,因為它不依賴于編譯器必須知道關于 lu 的類型參數的任何信息:

  Listli = new ArrayList();

  li.add(new Integer(42));

  List lu = li;

  lu.clear();

  4.6 泛型方法

  (在 類型參數 一節中)您已經看到,通過在類的定義中添加一個形式類型參數列表,可以將類泛型化。方法也可以被泛型化,不管它們定義在其中的類是不是泛型化的。

  泛型類在多個方法簽名間實施類型約束。在 List中,類型參數 V 出現在 get()、add()、contains() 等方法的簽名中。當創建一個 Map類型的變量時,您就在方法之間宣稱一個類型約束。您傳遞給 add() 的值將與 get() 返回的值的類型相同。

  類似地,之所以聲明泛型方法,一般是因為您想要在該方法的多個參數之間宣稱一個類型約束。例如,下面代碼中的 ifThenElse() 方法,根據它的第一個參數的布爾值,它將返回第二個或第三個參數:

  publicT ifThenElse(boolean b, T first, T second) {

  return b ? first : second;

  }

  注意,您可以調用 ifThenElse(),而不用顯式地告訴編譯器,您想要 T 的什么值。編譯器不必顯式地被告知 T 將具有什么值;它只知道這些值都必須相同。編譯器允許您調用下面的代碼,因為編譯器可以使用類型推理來推斷出,替代 T 的 String 滿足所有的類型約束: String s = ifThenElse(b, "a", "b");

  類似地,您可以調用:

  Integer i = ifThenElse(b, new Integer(1), new Integer(2));

  但是,編譯器不允許下面的代碼,因為沒有類型會滿足所需的類型約束:

  String s = ifThenElse(b, "pi", new Float(3.14));

  為什么您選擇使用泛型方法,而不是將類型 T 添加到類定義呢?(至少)有兩種情況應該這樣做:

  當泛型方法是靜態的時,這種情況下不能使用類類型參數。

  當 T 上的類型約束對于方法真正是局部的時,這意味著沒有在相同類的另一個方法簽名中使用相同類型 T 的約束。通過使得泛型方法的類型參數對于方法是局部的,可以簡化封閉類型的簽名。

  4.7 有限制類型

  在前一屏 泛型方法 的例子中,類型參數 V 是無約束的或無限制的類型。有時在還沒有完全指定類型參數時,需要對類型參數指定附加的約束。

  考慮例子 Matrix 類,它使用類型參數 V,該參數由 Number 類來限制:

  public class Matrix{ ... }

  編譯器允許您創建 Matrix或 Matrix類型的變量,但是如果您試圖定義


本文來源http://www.nvnqwx.com/gongwen/gongzuojihua/2972334.htm
以上內容來自互聯網,請自行判斷內容的正確性。若本站收錄的信息無意侵犯了貴司版權,請給我們來信(zaixianzuowenhezi@gmail.com),我們會及時處理和回復,謝謝.
国产精品尤物福利片在线观看_少妇免费毛片久久久久久久久_久久久久成人精品免费播放动漫_日韩av综合在线观看
日本精品免费视频| 欧美区高清在线| 日韩最新免费不卡| 国产成人精品福利一区二区三区 | 91.com在线| 99久热re在线精品视频| 99高清视频有精品视频| 91国产视频在线播放| 久久久这里只有精品视频| 久久偷窥视频| 国产富婆一区二区三区| 久久免费看av| 日韩一级裸体免费视频| 日韩色av导航| 日韩一区二区久久久| 久久久99久久精品女同性| 国产成人精品免费久久久久| 九色91在线视频| 久久99欧美| 国产精品久久一区| 这里只有精品66| 色爱区成人综合网| 欧洲成人在线观看| 美女在线免费视频| 97人人模人人爽人人喊38tv | 色偷偷噜噜噜亚洲男人的天堂| 久久久久久免费精品| 国产精品美女www| 中文字幕剧情在线观看一区| 一本久久a久久精品vr综合| 色哺乳xxxxhd奶水米仓惠香| 欧洲精品久久久| 国产日韩欧美自拍| 91免费在线观看网站| www.欧美精品一二三区| 精品国产乱码一区二区三区四区| 午夜精品理论片| 免费看日b视频| 久久久久久av无码免费网站下载| 国产成人看片| 亚洲高清视频一区二区| 狠狠综合久久av| 成人a视频在线观看| 久久久久久久999精品视频| 国产精品视频白浆免费视频| 亚洲精品在线观看免费| 欧美日韩亚洲综合一区二区三区激情在线| 欧美韩国日本精品一区二区三区| av动漫在线观看| 国产精品老牛影院在线观看| 亚洲 国产 日韩 综合一区| 国产综合在线看| 九色在线视频观看| 亚洲在线免费观看| 欧美a在线视频| 久久久久天天天天| 午夜精品一区二区三区四区| 国产一区香蕉久久| 久久精品国产91精品亚洲| 一区二区三区久久网| 国模视频一区二区| 日韩在线激情视频| 亚州成人av在线| 俄罗斯精品一区二区三区| 国产精品日韩av| 日韩精品视频在线观看视频| www污在线观看| 精品久久中出| 狠狠爱一区二区三区| 日韩亚洲综合在线| 日韩av影视| 91精品国产91久久久久久久久| 欧美情侣性视频| 蜜桃91精品入口| www.日韩系列| 日韩免费电影一区二区三区| 国产精品∨欧美精品v日韩精品| 亚洲午夜高清视频| 国产久一一精品| 久99九色视频在线观看| 国产日韩在线免费| 精品国产第一页| 国产伦精品一区二区三区高清版 | 亚洲国产欧美一区二区三区不卡 | 久久亚洲精品欧美| 亚洲欧洲精品在线| www.日本在线视频| 亚洲欧洲日韩精品| 91精品在线播放| 午夜久久资源| 久久久国产精品一区二区三区| 日韩一区国产在线观看| 久久免费成人精品视频| 日本精品va在线观看| 深夜福利日韩在线看| 欧美亚洲另类在线| 国产精品网站免费| 男女猛烈激情xx00免费视频| 日本精品一区在线观看| 日本一区免费在线观看| 国产美女直播视频一区| 欧美成人精品一区| 国产精品中文字幕在线观看| 在线一区高清| 久久久神马电影| 日韩免费观看网站| 国产精品日日摸夜夜添夜夜av| 黄色国产小视频| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美尤物巨大精品爽| 精品国产一区二区三区久久久狼| 日本一区二区免费高清视频| 日韩亚洲第一页| 国产综合在线观看视频| 欧美精品成人在线| 91国内在线视频| 欧美性大战久久久久xxx| 国产精品高清免费在线观看| 国产精品一区二区三区久久| 日韩在线视频在线| 国产精品入口日韩视频大尺度| 国产素人在线观看| 亚洲一区二区精品在线| 国产成人福利网站| 国内精品久久影院| 一道精品一区二区三区| 久久久中精品2020中文| 欧美xxxx黑人又粗又长精品| 亚洲综合五月天| 国产精品私拍pans大尺度在线| 国产欧美日韩在线播放| 日本精品久久久久中文字幕| 国产精品久久久久久久久久久不卡 | 一区二区精品免费视频| 久久综合九色综合网站| 欧美成人一区二区在线观看| 亚洲一区二区在线看| 国产成人欧美在线观看| 国产精自产拍久久久久久| 日韩av电影在线免费播放| 操91在线视频| 国产成人在线小视频| 国产日韩欧美在线| 欧美这里只有精品| 亚洲欧洲日夜超级视频| 国产精品国产三级欧美二区 | 亚洲一区二区在线观| 久久久久久久影院| 国产噜噜噜噜噜久久久久久久久| 日本十八禁视频无遮挡| 欧美日本啪啪无遮挡网站| 久久av秘一区二区三区| 99久热在线精品视频| 激情伊人五月天| 日韩av电影在线播放| 欧美xxxx14xxxxx性爽| 久久天堂电影网| 久久亚洲精品无码va白人极品| 国产欧美久久久久久| 日韩欧美精品在线不卡| 一区二区三区av在线| 欧美精品在线网站| 久久韩国免费视频| 久草综合在线观看| 91高潮精品免费porn| 国产美女网站在线观看| 国内自拍欧美激情| 欧美性资源免费| 日av在线播放中文不卡| 亚洲不卡中文字幕| 伊人久久婷婷色综合98网| 久久国产精品久久久久| 国产精品久久久久久久久男| www.日韩系列| 国产a一区二区| 91精品久久香蕉国产线看观看| 国产精品一区免费观看| 国产欧美在线播放| 国产欧美日韩91| 国产私拍一区| 国产另类第一区| 成人精品一区二区三区电影黑人| 国产欧美精品一区二区三区介绍| 国产一区二区在线网站| 国产一区高清视频| 国产日韩欧美在线| 国产精品一区视频| 99精品人妻少妇一区二区| 成人欧美一区二区三区黑人免费| 国产专区在线视频| 国产欧美一区二区三区久久| 国产视频一区二区视频| 国产精品一区在线播放| 北条麻妃av高潮尖叫在线观看| 成人av色在线观看| 99视频精品全部免费看| 91精品国产沙发| 日本十八禁视频无遮挡| 日韩激情久久| 欧美日韩亚洲一区二区三区在线观看 |