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

首頁 > 編程 > Java > 正文

Java中的泛型詳解

2019-11-26 15:13:05
字體:
來源:轉載
供稿:網友

所謂泛型:就是允許在定義類、接口指定類型形參,這個類型形參在將在聲明變量、創建對象時確定(即傳入實際的類型參數,也可稱為類型實參)

泛型類或接口

“菱形”語法

復制代碼 代碼如下:

//定義
 
public interface List<E> extends Collection<E> 
 
public class HashMap<K,V> extends AbstractMap<K,V>  implements Map<K,V>, Cloneable, Serializable
//使用
 
List<String> list = new ArrayList();
 
//Java7以后可以省略后面尖括號的類型參數
 
List<String> list = new ArrayList<>();

從泛型類派生子類

復制代碼 代碼如下:

//方式1
 
public class App extends GenericType<String>
 
//方式2
 
public class App<T> extends GenericType<T>
 
//方式3
 
public class App extends GenericType

偽泛型

不存在真正的泛型類,泛型類對Java虛擬機來說是透明的.JVM并不知道泛型類的存在,換句話來說,JVM處理泛型類和普通類沒什么區別的.因此在靜態方法、靜態初始化塊、靜態變量里面不允許使用類型形參。
- 以下方式都是錯誤的

復制代碼 代碼如下:

private static T data;
 
static{
 
    T f;
 
}
 
public static void func(){
 
    T name = 1;
 
}

下面的例子可以從側面驗證不存在泛型類
復制代碼 代碼如下:

public static void main(String[] args){
 
        List<String> a1 = new ArrayList<>();
        List<Integer> a2 = new ArrayList<>(); 
    System.out.println(a1.getClass() == a2.getClass());
 
    System.out.println(a1.getClass());
 
    System.out.println(a2.getClass());
 
}

輸出
復制代碼 代碼如下:

true
 
class java.util.ArrayList
 
class java.util.ArrayList

類型通配符

首先必須明確一點,假如Foo是Bar的父類,但是List<Foo>并不是List<Bar>的父類.為了表示各種泛型的父類,Java使用"?"來表示泛型通配.即List<?>來表示各種泛型List的父類.帶這種通配符List泛型不能設置(set)元素,只能獲?。╣et)元素。因為程序無法確定List中的類型,所以不能添加對象。但獲取的對象肯定是Object類型。

以下方法會編譯出錯:

復制代碼 代碼如下:

List<?> list = new ArrayList<>();
 
list.add(new Object());

主意幾點:

1.List<String>對象不能被當成List<Object>對象使用,也就是說:List<String>類并不是List<Object>類的子類。

2.數組和泛型有所不同:假設Foo是Bar的一個子類型(子類或者子接口),那么Foo[]依然是Bar[]的子類型;但G<Foo>不是G<Bar>的子類型。

3.為了表示各種泛型List的父類,我們需要使用類型通配符,類型通配符是一個問號(?),將一個問號作為類型實參傳給List集合,寫作:List<?>(意思是未知類型元素的List)。這個問號(?)被稱為通配符,它的元素類型可以匹配任何類型。

通配符的上限

List<? extends SuperType>表示所有SuperType泛型List的父類或本身。帶有通配符上限的泛型不能有set方法,只能有get方法。

設置通配符上限能解決如下問題:Dog是Animal子類,有個getSize方法要獲取傳入List的個數,代碼如下

復制代碼 代碼如下:

abstract class Animal {
    public abstract void run();
}
class Dog extends Animal {
    public void run() {
        System.out.println("Dog run");
    }
}
public class App {
    public static void getSize(List<Animal> list) {
        System.out.println(list.size());
    }
    public static void main(String[] args) {
        List<Dog> list = new ArrayList<>();
        getSize(list); // 這里編譯報錯
    }
}

這里編程出錯的原因是List<Animal>并不是List<Dog>的父類。解決方案一可以把getSize方法中形參List<Animal>改為List<?>,不過這樣的話在每次get對象的時候都要強制類型轉換,比較麻煩。使用通配符上限很好的解決了這個問題,可以把List<Animal>改為List<? extends Animal>,編譯就不會錯了,也不用類型轉換。

通配符的下限

List<? super SubType>表示SubType泛型List的下限。帶有通配符上限的泛型不能有get方法,只能有set方法。

泛型方法

如果定義類、接口是沒有使用類型形參,但定義方法時想自己定義類型形參,這也是可以的,JDK1.5還提供了泛型方法的支持。泛型方法的方法簽名比普通方法的方法簽名多了類型形參聲明,類型形參聲明以尖括號括起來,多個類型形參之間以逗號(,)隔開,所有類型形參聲明放在方法修飾符和方法返回值類型之間.語法格式如下:

復制代碼 代碼如下:

修飾符 返回值類型 方法名(類形列表){
 
//方法體
 
}

泛型方法允許類型形參被用來表示方法的一個或多個參數之間的類型依賴關系,或者方法返回值與參數之間的類型依賴關系。如果沒有這樣的類型依賴關系,就不應該使用泛型方法。Collections的copy方法就使用泛型方法:
復制代碼 代碼如下:

 public static <T> void copy(List<? super T> dest, List<? extends T> src){ ...}

這個方法要求src類型必須是dest類型的子類或本身。

擦除和轉換

在嚴格的泛型代碼里,帶泛型聲明的類總應該帶著類型參數。但為了與老的Java代碼保持一致,也允許在使用帶泛型聲明的類時不指定類型參數。如果沒有為這個泛型類指定類型參數,則該類型參數被稱作一個raw type(原始類型),默認是該聲明該參數時指定的第一個上限類型。

當把一個具有泛型信息的對象賦給另一個沒有泛型信息的變量時,則所有在尖括號之間的類型信息都被扔掉了。比如說一個List<String>類型被轉換為List,則該List對集合元素的類型檢查變成了成類型變量的上限(即Object),這種情況被為擦除。

示例

復制代碼 代碼如下:

class Apple<T extends Number>
 
{
 
 T size;
 
 public Apple()
 
 {
 
 }
 
 public Apple(T size)
 
 {
 
  this.size = size;
 
 }
 
 public void setSize(T size)
 
 {
 
  this.size = size;
 
 }
 
 public T getSize()
 
 {
 
  return this.size;
 
 }
 
}
 
public class ErasureTest
 
{
 
 public static void main(String[] args)
 
 {
 
  Apple<Integer> a = new Apple<>(6);    // ①
 
  // a的getSize方法返回Integer對象
 
  Integer as = a.getSize();
 
  // 把a對象賦給Apple變量,丟失尖括號里的類型信息
 
  Apple b = a;      // ②
 
  // b只知道size的類型是Number
 
  Number size1 = b.getSize();
 
  // 下面代碼引起編譯錯誤
 
  Integer size2 = b.getSize();  // ③
 
 }
 
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美成人精品| 国产亚洲精品久久| 国内久久久精品| 欧美精品电影在线| 国产日韩在线视频| 亚洲欧美一区二区三区在线| 欧美日韩国产一区二区| 欧美日韩免费在线| 中文字幕视频在线免费欧美日韩综合在线看| 欧美成人午夜激情在线| 在线看日韩欧美| 欧美www视频在线观看| 欧美做爰性生交视频| 久久视频精品在线| 国产一区二区久久精品| 欧美视频精品一区| 日韩高清电影免费观看完整版| 91九色国产社区在线观看| 成人亚洲激情网| 亚洲福利精品在线| 青青草99啪国产免费| 欧美第一淫aaasss性| 国产亚洲综合久久| 亚洲天堂第二页| 亚洲精品视频在线播放| 成人中心免费视频| 黄色成人在线免费| 亚洲电影免费观看高清完整版在线| 亚洲欧美日韩中文视频| 亚洲大胆人体视频| 欧美精品在线免费播放| 久久久精品欧美| 国产精品美女无圣光视频| 日韩女优人人人人射在线视频| 国产精品老牛影院在线观看| 中文字幕成人在线| 日韩最新中文字幕电影免费看| www.久久草.com| 亚洲日本成人女熟在线观看| 成人福利网站在线观看11| 亚洲国产91色在线| 91日本在线观看| 欧美性xxxxx极品娇小| 欧美一级淫片videoshd| 国色天香2019中文字幕在线观看| 国产aaa精品| 久久久伊人日本| 欧美激情中文字幕在线| 亚洲缚视频在线观看| 久久久人成影片一区二区三区观看| 亚洲欧美日本伦理| 日本亚洲欧洲色α| 日韩影视在线观看| 国产在线观看不卡| 日韩在线视频导航| 久久视频在线免费观看| 一区二区三区视频免费在线观看| 91av在线国产| 国产精品大片wwwwww| 自拍视频国产精品| 欧美日韩在线视频首页| 欧美性xxxxx极品| 一本色道久久88亚洲综合88| 欧美黑人xxxx| 久久久精品国产亚洲| 亚洲偷熟乱区亚洲香蕉av| 97在线视频免费观看| 日韩av综合网站| 国产精品美腿一区在线看| 亚洲国产精品yw在线观看| 国产亚洲欧洲高清一区| 久久国产精品久久久| 国产精品男人爽免费视频1| 欧美性极品少妇精品网站| 国产一区二区欧美日韩| 国模叶桐国产精品一区| www.午夜精品| 久久天天躁狠狠躁老女人| 国自在线精品视频| 91中文字幕一区| 深夜福利日韩在线看| 久久综合九色九九| 97免费视频在线| 97成人精品视频在线观看| 性色av一区二区三区| 97超碰国产精品女人人人爽| 亚洲国产精品久久91精品| 国产精品av免费在线观看| 国产精品久久久久91| 91av中文字幕| 亚洲国产精品久久| 久久精品亚洲国产| 久久好看免费视频| 亚洲伊人成综合成人网| 欧美视频在线观看 亚洲欧| 国产午夜精品免费一区二区三区| 欧美一级视频一区二区| 清纯唯美亚洲激情| 欧美怡春院一区二区三区| 亚洲精品国产精品久久清纯直播| 色综合久久88| 国产香蕉97碰碰久久人人| 亚洲欧美成人精品| 黑丝美女久久久| 亚洲欧洲成视频免费观看| 亚洲成人黄色在线观看| 久久亚洲精品中文字幕冲田杏梨| 久久久精品久久久久| 97视频在线观看播放| 欧美精品中文字幕一区| 91精品久久久久久久久久| 国产精品久久久久久久久久ktv| 久久久欧美一区二区| 青青精品视频播放| 国产精品日韩在线观看| 一区二区日韩精品| 久久这里只有精品99| 精品中文字幕在线| 欧美一二三视频| 97久久精品人人澡人人爽缅北| 国产精品xxx视频| 岛国av一区二区| 国产亚洲精品美女| 日韩成人黄色av| 在线电影中文日韩| 日韩电影网在线| 91精品国产综合久久香蕉最新版| 亚洲国产精品99| 91免费人成网站在线观看18| 亚洲第一视频在线观看| 国产精品影院在线观看| 日韩国产在线播放| 色青青草原桃花久久综合| 久久亚洲成人精品| 亚洲国产精品热久久| 美女av一区二区| 国产精品国模在线| 日韩亚洲精品视频| 少妇精69xxtheporn| 国产精品99蜜臀久久不卡二区| 2018中文字幕一区二区三区| 精品久久久久久久久国产字幕| 久久99精品视频一区97| 亚洲经典中文字幕| 国产精品久久综合av爱欲tv| 国产精品第三页| 精品国内产的精品视频在线观看| 一区二区三区在线播放欧美| 欧洲美女免费图片一区| 精品中文字幕乱| 国产精品第一视频| 日韩大片在线观看视频| 欧美激情一区二区三级高清视频| 日韩免费看的电影电视剧大全| 国产日产欧美a一级在线| 久久成人精品视频| 欧美日韩国产成人在线| 国产在线观看一区二区三区| 欧美日韩国产中文字幕| 热久久美女精品天天吊色| 国产成人拍精品视频午夜网站| 欧美成人自拍视频| 亚洲国产高清自拍| 人九九综合九九宗合|