欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

本篇文章給大家分享的是有關JDK5.0新特性的泛型怎么理解,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

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

沒有參數(shù)的情況下使用泛型
   既然在J2SE 5.0中收集類型已經泛型化,那么,原來的使用這些類型的代碼將如何呢?很幸運,他們在JAVA 5中將繼續(xù)工作,因為你能使用沒有參數(shù)的泛型。比如,你能繼續(xù)像原來一樣使用List接口,正如下面的例子一樣。

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

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

盡管如此,一個需要注意的事情是,JDK5編譯器希望你使用帶參數(shù)的泛型。否則,編譯器將提示警告,因為他認為你可能忘了定義類型變量s。比如,編譯上面的代碼的時候你會看到下面這些警告,因為第一個List被認為是原型。

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

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

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

List

list1 = new ArrayList();
List

list2 = new ArrayList();

list1指向了一個類型變量s為java.lang.Objects 的List而list2指向了一個類型變量s為String 的List。所以傳遞一個List給一個參數(shù)為List的函數(shù)將導致compile time錯誤。下面列表可以說明:

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

public static void doIt(List l) {}

在某些情況下你會考慮使用 ? 通配符。比如,你有一個printList函數(shù),這個函數(shù)打印一個List的所有成員,你想讓這個函數(shù)對任何類型的List起作用時。否則,你只能累死累活的寫很多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);
 }
}

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

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

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

List
myList = new ArrayList();

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

你能使用原型或使用通配符,但這樣無法在編譯時進行安全類型檢查,因為你能傳遞任何類型的List,比如List的實例。你可以使用List作為參數(shù),但是你就只能傳遞List給函數(shù)。但這樣就使你的函數(shù)功能減少,因為你可能更多的時候要操作List或List,而不是List

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

使用上界規(guī)則的語法這么定義的:GenericType<!--xtends upperBoundTy--&gt. 比如,對getAverage函數(shù)的參數(shù),你可以這么寫List<!--xtends Numb--&gt. 下面例子說明了如何使用這種規(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ù)允許你傳遞一個List或一個類型變量是任何java.lang.Number子類的List。

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

創(chuàng)建泛型

前面的章節(jié)主要說明了如何使使用泛型,特別是集合框架中的類。現(xiàn)在我們開始學習如何寫自己的泛型。

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

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

以上就是JDK5.0新特性的泛型怎么理解,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網站欄目:JDK5.0新特性的泛型怎么理解
標題來源:http://www.chinadenli.net/article6/gjchig.html

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

廣告

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

小程序開發(fā)