亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

技術分析之——J2SE 5.0中的泛型

2019-11-18 11:54:33
字體:
來源:轉載
供稿:網友

  摘要
  
  泛型是J2SE 5.0最重要的特性。他們讓你寫一個type(類或接口)和創建一個實例通過傳遞一個或多個引用類型。這個實例受限于只能作用于這些類型。比如,在java 5,java.util.List 已經被泛化。當建立一個list對象時,你通過傳遞一個java類型建立一個List實例,此list實例只能作用于所傳遞的類型。這意味著假如你傳遞一個String ,此List實例只能擁有String對象;假如你傳遞一個Integer,此實例只能存貯Integer對象。除了創建參數化的類型,你還能創建參數化的函數。
  
  泛型的第一個好處是編譯時的嚴格類型檢查。這是集合框架最重要的特點。此外,泛型消除了絕大多數的類型轉換。在JDK 5.0之前,當你使用集合框架時,你不得不進行類型轉換。
  
  本文將教你如何操作泛型。它的第一部分是“沒有泛型的日子”,先讓我們回憶老版本JDK的不便。然后,舉一些泛型的例子。在討論完語法以及有界泛型的使用之后,文章最后一章將解釋如何寫泛型。
  
  沒有泛型的日子
  
  所有的java類都源自java.lang.Object,這意味著所有的JAVA對象能轉換成Object。因此,在之前的JDK的版本中,很多集合框架的函數接受一個Object參數。所以,collections是一個能持有任何對象的多用途工具,但帶來了不良的后果。
  
  舉個簡單的例子,在JDK 5.0的之前版本中,類List的函數add接受一個Object參數:
  
  public boolean add(java.lang.Object element)
  
  所以你能傳遞任何類型給add。這是故意這么設計的。否則,它只能傳遞某種特定的對象,這樣就會出現各種List類型,如,StringList, EmployeeList, AddressList等。
  
  add通過Object傳遞能帶來好處,現在我們考慮get函數(返回List中的一個元素).如下是JDK 5之前版本的定義:
  
  public java.lang.Object get(int index) throws IndexOutOfBoundsException
  
  get返回一個Object.不幸的事情從此開始了.假如你儲存了兩個String對象在一個List中:
  
  List stringList1 = new ArrayList();stringList1.add("Java 5");stringList1.add("with generics");
  
  當你想從stringList1取得一個元素時,你得到了一個Object.為了操作原來的類型元素,你不得不把它轉換為String。
  
  String s1 = (String) stringList1.get(0);
  
  但是,假如你曾經把一個非String對象加入stringList1中,上面的代碼會拋出一個ClassCastException. 有了泛型,你能創建一個單一用途的List實例.比如,你能創建一個只接受String對象的List實例,另外一個實例只能接受Employee對象.這同樣適用于集合框架中的其他類型.
  
  泛型入門
  
  像一個函數能接受參數一樣,一個泛型也能接受參數.這就是一個泛型經常被稱為一個參數化類型的原因.但是不像函數用()傳遞參數,泛型是用<>傳遞參數的.聲明一個泛型和聲明一個普通類沒有什么區別,只不過你把泛型的變量放在<>中.
  
  比如,在JDK 5中,你可以這樣聲明一個java.util.List : List<E> myList;
  
  E 稱為類型變量.意味著一個變量將被一個類型替代.替代類型變量的值將被當作參數或返回類型.對于List接口來說,當一個實例被創建以后,E 將被當作一個add或別的函數的參數.E 也會使get或別的參數的返回值.下面是add和get的定義:
  
  boolean add<E o>E get(int index)
  
  NOTE:一個泛型在聲明或例示時答應你傳遞特定的類型變量: E.除此之外,假如E是個類,你可以傳遞子類;假如E是個接口,你可以傳遞實現接口的類;
  
  List<Number> numberList= new ArrayList<Number>();
  numberList.add(2.0);
  numberList.add(2);
  
  假如你傳遞一個String給一個List,比如:
  
  List<String> myList;
  
  那么mylist的add函數將接受一個String作為他的參數,而get函數將返回一個String.因為返回了一個特定的類型,所以不用類型轉化了。
  
  NOTE:根據慣例,我們使用一個唯一的大寫字目表示一個類型變量。為了創建一個泛型,你需在聲明時傳遞同樣的參數列表。比如,你要想創建一個ArrayList來操作String ,你必須把String放在<>中。如:
  
  List<String> myList = new ArrayList<String>();
  
  再比如,java.util.Map 是這么定義的:
  
  public interface Map<K,V>
  
  K用來聲明map鍵(KEY)的類型而V用來表示值(VALUE)的類型。put和values是這么定義的:
  
  V put(K key, V value)Collection<V> values()
  
  NOTE:一個泛型不準直接的或間接的是java.lang.Throwable的子類。因為異常是在運行時拋出的,所以它不可能預言什么類型的異常將在編譯時拋出.
  
  列表1的例子將比較List在JDK 1.4 和JDK1.5的不同
  
  package com.brainysoftware.jdk5.app16;import java.util.List;import java.util.ArrayList;public class GenericListTest { public static void main(String[] args) {  // in JDK 1.4  List stringList1 = new ArrayList();  stringList1.add("Java 1.0 - 5.0");  stringList1.add("without generics");  // cast to java.lang.String  String s1 = (String) stringList1.get(0);  System.out.println(s1.toUpperCase());  // now with generics in JDK 5  List<String> stringList2 = new ArrayList<String>();  stringList2.add("Java 5.0");  stringList2.add("with generics");  // no need for type casting  String s2 = stringList2.get(0);  System.out.PRintln(s2.toUpperCase()); }}
  
  在列表1中,stringList2是個泛型。聲明List<String>告訴編譯器List的實例能接受一個String對象。當然,在另外的情況中,你能新建能接受各種對象的List實例。注重,當從List實例中返回成員元素時,不需要對象轉化,因為他返回的了你想要的類型,也就是String.
  
  NOTE:泛型的類型檢查(type checking)是在編譯時完成的.
  
  最讓人感愛好的事情是,一個泛型是個類型并且能被當作一個類型變量。比如,你想你的List儲存lists of Strings,你能通過把List<String>作為他的類型變量來聲明List。比如:
  
  List<List<String>> myListOfListsOfStrings;
  
  要從myList中的第一個List重新取得String,你可以這么用:
  
  String s = myListOfListsOfStrings.get(0).get(0);
  
  下一個列表中的ListOfListsTest類示范了一個List(命名為listOfLists)接受一個String List作為參數。
  
  package com.brainysoftware.jdk5.app16;import java.util.ArrayList;import java.util.List;public class ListOfListsTest { public static void main(String[] args) {  List<String> listOfStrings = new ArrayList<String>();  listOfStrings.add("Hello again");  List<List<String>> listOfLists = new ArrayList<List<String>>();  listOfLists.add(listOfStrings);  String s = listOfLists.get(0).get(0);  System.out.println(s); // prints "Hello again" }}
  
  另外,一個泛型接受一個或多個類型變量。比如,java.util.Map有兩個類型變量s。第一個定義了鍵(key)的類型,第二個定義了值(value)的類型。下面的例子講教我們如何使用個一個泛型Map.
  
  package com.brainysoftware.jdk5.app16;import java.util.HashMap;import java.util.Map;public class MapTest { public static void main(String[] args) {  Map<String, String> map = new HashMap<String, String>();  map.put("key1", "value1");  map.put("key2", "value2");  String value1 = map.get("key1"); }}
  
  在這個例子中,重新得到一個key1代表的String值,我們不需要任何類型轉換。
  
  沒有參數的情況下使用泛型
  
  既然在J2SE 5.0中收集類型已經泛型化,那么,原來的使用這些類型的代碼將如何呢?很幸運,他們在JAVA 5中將繼續工作,因為你能使用沒有參數的泛型。比如,你能繼續像原來一樣使用List接口,正如下面的例子一樣。
  
  List stringList1 = new ArrayList();stringList1.add("Java 1.0 - 5.0");stringList1.add("without generics");String s1 = (String) stringList1.get(0);
  
  一個沒有任何參數的泛型被稱為原型(raw type)。它意味著這些為JDK1.4或更早的版本而寫的代碼將繼續在java 5中工作。
  
  盡管如此,一個需要注重的事情是,JDK5編譯器希望你使用帶參數的泛型。否則,編譯器將提示警告,因為他認為你可能忘了定義類型變量s。比如,編譯上面的代碼的時候你會看到下面這些警告,因為第一個List被認為是原型。
  
  Note: com/brainysoftware/jdk5/app16/GenericListTest.java
  uses unchecked or unsafe Operations.
  Note: Recompile with -Xlint:unchecked for details.
  
  當你使用原型時,假如你不想看到這些警告,你有幾個選擇來達到目的:
  
  1.編譯時帶上參數-source 1.4
  
  2.使用@SupressWarnings("unchecked")注釋
  
  3.更新你的代碼,使用List<Object>. List<Object>的實例能接受任何類型的對象,就像是一個原型List。然而,編譯器不會報錯。
  
  使用 ? 通配符
  
  前

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久国产精彩视频美女艺术照福利| 久久久成人av| 国产女人精品视频| 综合国产在线视频| 亚洲free性xxxx护士白浆| 国产精品久久久久999| 国产日韩欧美电影在线观看| 欧美性视频网站| 精品偷拍一区二区三区在线看| 97在线免费视频| 国产成人在线一区二区| 欧美一区二区三区图| 日韩中文字在线| 欧美成人网在线| 精品国产老师黑色丝袜高跟鞋| 久久精品久久久久久| 91av视频在线播放| 久久精品国产成人| 91日本在线视频| 色小说视频一区| zzjj国产精品一区二区| 久久久久久国产精品美女| 美女性感视频久久久| 亚洲电影中文字幕| 亚洲精品网址在线观看| 亚洲国产另类 国产精品国产免费| 欧美午夜激情视频| 日产精品久久久一区二区福利| 亚洲欧美一区二区激情| 日韩亚洲一区二区| xvideos亚洲人网站| 久久艹在线视频| 欧美成人在线免费| 亚洲最新av在线网站| 亚洲精品一区在线观看香蕉| 热久久99这里有精品| 欧美与欧洲交xxxx免费观看| 粉嫩av一区二区三区免费野| 日韩精品免费观看| 精品视频在线播放色网色视频| 国产成人精品一区二区| 欧美激情综合亚洲一二区| 国产精品免费看久久久香蕉| 国产成人欧美在线观看| 97久久国产精品| 蜜臀久久99精品久久久无需会员| 免费99精品国产自在在线| 欧美一区二区视频97| 日韩成人中文字幕| 7m第一福利500精品视频| 曰本色欧美视频在线| 欧美富婆性猛交| 欧美日韩加勒比精品一区| 亚洲专区国产精品| 亚洲伊人久久综合| 日韩国产在线看| 欧美日韩国产在线播放| 久久人人爽人人爽人人片亚洲| 国产一区二区三区网站| 91午夜理伦私人影院| 国产午夜精品一区二区三区| 欧美日韩在线视频一区| 欧美日韩亚洲激情| 色狠狠久久aa北条麻妃| 国产精品2018| 国产精品亚洲一区二区三区| 91沈先生在线观看| 欧美在线一区二区三区四| 国产综合香蕉五月婷在线| 国内精品中文字幕| 欧美电影免费观看网站| 日本高清视频精品| 亚洲人成网站免费播放| 久久在线免费观看视频| 在线午夜精品自拍| 日韩欧美国产视频| 亚洲黄色在线观看| 国产精品爱啪在线线免费观看| 亚洲图中文字幕| 欧美激情一区二区三区久久久| 欧美成人免费在线观看| 国产一区二区日韩| 国产精品96久久久久久| 精品网站999www| 日韩中文在线视频| 欧美激情精品久久久久久久变态| 亚洲xxx自由成熟| 亚洲一区二区三区毛片| 亚洲国产精久久久久久| 欧美精品18videos性欧| 性日韩欧美在线视频| 国产精品久久久久久搜索| 国产精品中文字幕在线观看| 中文字幕亚洲情99在线| 亚洲国产精品女人久久久| 国产精品十八以下禁看| 国产日本欧美在线观看| 成人av资源在线播放| 555www成人网| 国产香蕉精品视频一区二区三区| 最新69国产成人精品视频免费| 日日狠狠久久偷偷四色综合免费| 国产精品扒开腿做爽爽爽视频| 国产精品色悠悠| 欧美成人一二三| 欧美午夜激情小视频| 久久亚洲精品中文字幕冲田杏梨| 日本免费一区二区三区视频观看| 日韩视频―中文字幕| 久久久久久久久91| 日本亚洲欧洲色α| 欧美中文字幕在线播放| 亚洲美腿欧美激情另类| 国产成人精品最新| 欧美插天视频在线播放| 亚洲性夜色噜噜噜7777| 亚洲美女动态图120秒| 欧美激情在线一区| 亚洲欧洲偷拍精品| 日本亚洲精品在线观看| 国产欧美日韩免费| 美女av一区二区| 久久99久国产精品黄毛片入口| 精品国产91久久久久久| 国产丝袜高跟一区| 亚洲欧洲成视频免费观看| 欧美老女人性视频| 国产va免费精品高清在线观看| 日韩a**中文字幕| 亚洲一区二区三区xxx视频| 8090成年在线看片午夜| 中文字幕日韩av综合精品| 欧美在线视频导航| 国产精品久久在线观看| 欧美日韩国产中文精品字幕自在自线| 26uuu另类亚洲欧美日本老年| 91欧美激情另类亚洲| 欧美极品第一页| 国产不卡视频在线| 在线播放国产一区二区三区| 欧美人在线观看| 最近2019中文字幕一页二页| 国产视频999| 国产精品精品国产| 国产精品亚洲欧美导航| 国产深夜精品福利| 亚洲免费视频在线观看| 国产精品一香蕉国产线看观看| xvideos成人免费中文版| 亚洲美女自拍视频| 日本午夜精品理论片a级appf发布| 亚洲一区二区三区四区在线播放| 久久久久久久av| 91久久嫩草影院一区二区| 国产精品ⅴa在线观看h| 亚洲精品美女久久久| 亚洲欧美一区二区激情| 国产精品视频内| 欧美在线视频免费观看| 久久91亚洲精品中文字幕奶水| 亚洲bt欧美bt日本bt| 精品久久久久久久大神国产| 欧美激情2020午夜免费观看| 欧美国产中文字幕|