JDK5.0新特性的泛型怎么理解

本篇文章給大家分享的是有關(guān)JDK5.0新特性的泛型怎么理解,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

成都創(chuàng)新互聯(lián)成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元鹽城做網(wǎng)站,已為上家服務(wù),為鹽城各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

沒(méi)有參數(shù)的情況下使用泛型
   既然在J2SE 5.0中收集類型已經(jīng)泛型化,那么,原來(lái)的使用這些類型的代碼將如何呢?很幸運(yùn),他們?cè)贘AVA 5中將繼續(xù)工作,因?yàn)槟隳苁褂脹](méi)有參數(shù)的泛型。比如,你能繼續(xù)像原來(lái)一樣使用List接口,正如下面的例子一樣。

List stringList1 = new ArrayList();
stringList1.add("Java 1.0 - 5.0");
stringList1.add("without generics");
String s1 = (String) stringList1.get(0);

一個(gè)沒(méi)有任何參數(shù)的泛型被稱為原型(raw type)。它意味著這些為JDK1.4或更早的版本而寫(xiě)的代碼將繼續(xù)在java 5中工作。

盡管如此,一個(gè)需要注意的事情是,JDK5編譯器希望你使用帶參數(shù)的泛型。否則,編譯器將提示警告,因?yàn)樗J(rèn)為你可能忘了定義類型變量s。比如,編譯上面的代碼的時(shí)候你會(huì)看到下面這些警告,因?yàn)榈谝粋€(gè)List被認(rèn)為是原型。

Note: com/brainysoftware/jdk5/app16/GenericListTest.java
       uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

當(dāng)你使用原型時(shí),如果你不想看到這些警告,你有幾個(gè)選擇來(lái)達(dá)到目的:
1.編譯時(shí)帶上參數(shù)-source 1.4
2.使用@SupressWarnings("unchecked")注釋
3.更新你的代碼,使用List. List的實(shí)例能接受任何類型的對(duì)象,就像是一個(gè)原型List。然而,編譯器不會(huì)報(bào)錯(cuò)。

使用 ? 通配符
  前面提過(guò),如果你聲明了一個(gè)List, 那么這個(gè)List對(duì)aType起作用,所以你能儲(chǔ)存下面這些類型的對(duì)象:
1.一個(gè)aType的實(shí)例
2.它的子類的實(shí)例(如果aType是個(gè)類)
3.實(shí)現(xiàn)aType接口的類實(shí)例(如果aType是個(gè)接口)
但是,請(qǐng)注意,一個(gè)泛型本身是個(gè)JAVA類型,就像java.lang.String或java.io.File一樣。傳遞不同的類型變量給泛型可以創(chuàng)建不同的JAVA類型。比如,下面例子中l(wèi)ist1和list2引用了不同的類型對(duì)象。

List

list1 = new ArrayList();
List

list2 = new ArrayList();

list1指向了一個(gè)類型變量s為java.lang.Objects 的List而list2指向了一個(gè)類型變量s為String 的List。所以傳遞一個(gè)List給一個(gè)參數(shù)為L(zhǎng)ist的函數(shù)將導(dǎo)致compile time錯(cuò)誤。下面列表可以說(shuō)明:

public class AllowedTypeTest {
 public static void doIt(Listl) {
 }
 public static void main(String[] args) {
   ListmyList = new ArrayList();
   // 這里將產(chǎn)生一個(gè)錯(cuò)誤
   doIt(myList);
 }
}
上面的代碼無(wú)法編譯,因?yàn)槟阍噲D傳遞一個(gè)錯(cuò)誤的類型給函數(shù)doIt。doIt的參數(shù)是List二你傳遞的參數(shù)是List。
可以使用 ? 通配符解決這個(gè)難題。List 意味著一個(gè)對(duì)任何對(duì)象起作用的List。所以,doIt可以改為:

public static void doIt(List l) {}

在某些情況下你會(huì)考慮使用 ? 通配符。比如,你有一個(gè)printList函數(shù),這個(gè)函數(shù)打印一個(gè)List的所有成員,你想讓這個(gè)函數(shù)對(duì)任何類型的List起作用時(shí)。否則,你只能累死累活的寫(xiě)很多printList的重載函數(shù)。下面的列表引用了使用 ? 通配符的printList函數(shù)。

public class WildCardTest {

 public static void printList(List list) {
   for (Object element : list) {
     System.out.println(element);
   }
 }
 public static void main(String[] args) {
   Listlist1 = new ArrayList();
   list1.add("Hello");
   list1.add("World");
   printList(list1);

   Listlist2 = new ArrayList();
   list2.add(100);
   list2.add(200);
   printList(list2);
 }
}

這些代碼說(shuō)明了在printList函數(shù)中,List表示各種類型的List對(duì)象。然而,請(qǐng)注意,在聲明的時(shí)候使用 ? 通配符是不合法的,像這樣:

List myList = new ArrayList(); // 不合法

如果你想創(chuàng)建一個(gè)接收任何類型對(duì)象的List,你可以使用Object作為類型變量,就像這樣:

List
myList = new ArrayList();

在函數(shù)中使用界限通配符
在之前的章節(jié)中,你學(xué)會(huì)了通過(guò)傳遞不同的類型變量s來(lái)創(chuàng)建不同JAVA類型的泛型,但并不考慮類型變量s之間的繼承關(guān)系。在很多情況下,你想一個(gè)函數(shù)有不同的List參數(shù)。比如,你有一個(gè)函數(shù)getAverage,他返回了一個(gè)List中成員的平均值。然而,如果你把List作為getAverage的參數(shù),你就沒(méi)法傳遞List或List參數(shù),因?yàn)長(zhǎng)ist和List和List不是同樣的類型。

你能使用原型或使用通配符,但這樣無(wú)法在編譯時(shí)進(jìn)行安全類型檢查,因?yàn)槟隳軅鬟f任何類型的List,比如List的實(shí)例。你可以使用List作為參數(shù),但是你就只能傳遞List給函數(shù)。但這樣就使你的函數(shù)功能減少,因?yàn)槟憧赡芨嗟臅r(shí)候要操作List或List,而不是List

J2SE5.0增加了一個(gè)規(guī)則來(lái)解決了這種約束,這個(gè)規(guī)則就是允許你定義一個(gè)上界(upper bound) 類型變量.在這種方式中,你能傳遞一個(gè)類型或它的子類。在上面getAverage函數(shù)的例子中,你能傳遞一個(gè)List或它的子類的實(shí)例,比如Listor List。

使用上界規(guī)則的語(yǔ)法這么定義的:GenericType<!--xtends upperBoundTy--&gt. 比如,對(duì)getAverage函數(shù)的參數(shù),你可以這么寫(xiě)List<!--xtends Numb--&gt. 下面例子說(shuō)明了如何使用這種規(guī)則。
public class BoundedWildcardTest {
  public static double getAverage(List<!--xtends Numb--&gt numberList)
  {
    double total = 0.0;
    for (Number number : numberList)
      total += number.doubleValue();
    return total/numberList.size();
  }
 
  public static void main(String[] args) {
    List
由于有了上界規(guī)則,上面例子中的getAverage函數(shù)允許你傳遞一個(gè)List或一個(gè)類型變量是任何java.lang.Number子類的List。

下界規(guī)則
關(guān)鍵字extends定義了一個(gè)類型變量的上界。通過(guò)使用super關(guān)鍵字,我們可以定義一個(gè)類型變量的下界,盡管使用的情況不多。比如,如果一個(gè)函數(shù)的參數(shù)是List<!--uper Integ--&gt,那么意味著你可以傳遞一個(gè)List的實(shí)例或者任何java.lang.Integer的超類(superclass)。

創(chuàng)建泛型

前面的章節(jié)主要說(shuō)明了如何使使用泛型,特別是集合框架中的類?,F(xiàn)在我們開(kāi)始學(xué)習(xí)如何寫(xiě)自己的泛型。

基本上,除了聲明一些你想要使用的類型變量s外,一個(gè)泛型和別的類沒(méi)有什么區(qū)別。這些類型變量s位于類型后面的<>中。比如,下面的Point就是個(gè)泛型。一個(gè)Point對(duì)象代表了一個(gè)系統(tǒng)中的點(diǎn),它有橫坐標(biāo)和縱坐標(biāo)。通過(guò)使Point泛型化,你能定義一個(gè)點(diǎn)實(shí)例的精確程度。比如,如果一個(gè)Point對(duì)象需要非常精確,你就把Double作為類型變量。否則,Integer 就夠了。
package com.brainysoftware.jdk5.app16;
public class Point
在這個(gè)例子中,T是Point的類型變量 。T是getX和getY的返回值類型,也是setX和setY的參數(shù)類型。此外,構(gòu)造函數(shù)結(jié)合兩個(gè)T參數(shù)。
使用point類就像使用別的類一樣。比如,下面的例子創(chuàng)建了兩個(gè)Point對(duì)象:ponint1和point2。前者把Integer作為類型變量,而后者把Double作為類型變量。

Point
泛型使代碼在編譯時(shí)有了更嚴(yán)格的類型檢查。特別是在集合框架中,泛型有兩個(gè)作用。第一,他們?cè)黾恿藢?duì)集合類型在編譯時(shí)的類型檢查,所以集合類所能持有的類型對(duì)傳遞給它的參數(shù)類型起了限制作用。比如你創(chuàng)建了一個(gè)持有strings的java.util.List實(shí)例,那么他就將不能接受Integers或別的類型。其次,當(dāng)你從一個(gè)集合中取得一個(gè)元素時(shí),泛型消除了類型轉(zhuǎn)換的必要。
泛型能夠在沒(méi)有類型變量的情況下使用,比如,作為原型。這些措施讓Java 5之前的代碼能夠運(yùn)行在JRE 5中。但是,對(duì)新的應(yīng)用程序,你最好不要使用原型,因?yàn)橐院驤ava可能不支持他們。
你已經(jīng)知道通過(guò)傳遞不同類型的類型變量給泛型可以產(chǎn)生不同的JAVA類型。就是說(shuō)List和List的類型是不同的。盡管String是java.lang.Object。但是傳遞一個(gè)List給一個(gè)參數(shù)是List的函數(shù)會(huì)參數(shù)會(huì)產(chǎn)生編譯錯(cuò)誤(compile error)。函數(shù)能用 ? 通配符使其接受任何類型的參數(shù)。List 意味著任何類型的對(duì)象。最后,你已經(jīng)看到了寫(xiě)一個(gè)泛型和別的一般JAVA類沒(méi)有什么區(qū)別。你只需要在類型名稱后面的<>中聲明一系列的類型變量s就行了。這些類型變量s就是返回值類型或者參數(shù)類型。根據(jù)慣例,一個(gè)類型變量用一個(gè)大寫(xiě)字母表示。

以上就是JDK5.0新特性的泛型怎么理解,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:JDK5.0新特性的泛型怎么理解
標(biāo)題來(lái)源:http://muchs.cn/article6/gjchig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)用戶體驗(yàn)、App設(shè)計(jì)標(biāo)簽優(yōu)化、企業(yè)建站、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)