第9章 泛型

2021-09-17 21:20:52 字數 1408 閱讀 2093

增加了泛型支援後的集合,完全可以記住集合中元素的型別,並可以在編譯時檢查集合中元素的型別,如果試圖向集合中新增不滿足型別要求的物件,編譯器就會提示錯誤。

建立的方法是:在集合介面、類後增加尖括號,尖括號裡放乙個資料型別,如:

liststr = new arraylist<>();  //對於後面的<>,系統會自動識別為string型別
(1)如:

(2)泛型類派生子類

當使用這些介面、父類時不能再包含泛型形參,即上面的t要具體為string,如:

(3)不存在泛型類

如array相對於array只是說明只能新增string物件作為集合元素,不是新類。

在靜態方法、靜態初始化塊或者靜態變數的宣告和初始化中不允許使用泛型形參。

(1)若集合形參的元素型別不確定,則使用型別萬用字元<?>,它的元素型別可以匹配任何型別。注意,list類不是list的子類。

(2)型別萬用字元上限

指定型別萬用字元的上限,只能從集合中取元素,不能向集合中新增元素。(因為編譯器沒法確定集合元素實際是哪種型別)

比如foo是bar的子類,這樣a就相當於a<? entends foo>的子類,可以將a賦值給a<? entends foo>型別的變數,這種型變稱為協變。(協變只出不進)

(3)型別萬用字元下限

比如foo是bar的子類,當程式需要乙個a<? super bar>變數時,程式可以將a、a賦值給a<? super bar>型別的變數,這種型變稱為逆變。

(4)設定泛型形參的上限

若需要為泛型形參設定多個上限並實現多個介面,要求類上限須為第一位,如:

格式如下:修飾符 返回值型別 方法名(形參列表)

如:

static void fromarraytocollection(t a , collectionc)

泛型方法與型別萬用字元之間的轉換,如:

同時使用泛型方法和萬用字元的情況:

public class collection

}

改為使用泛型方法,不使用型別萬用字元:

class collection

}

允許呼叫構造器時在構造器之後使用一對尖括號來代表泛型資訊。如:

class myclass

}

定義乙個list物件,這個list物件保留了集合元素的型別資訊,當把這個list物件賦給乙個list型別的list後,編譯器就會丟失前者的泛型資訊,即丟失list集合裡元素的型別資訊,這就是典型的擦除。

如下面**是不允許的:

list arr = new arraylist[10];

//只能宣告,如new arraylist

第12章 泛型

泛型字母 形式型別引數 formal type parameters 即泛型字母 命名 泛型字母可以隨意指定,盡量使用單個的大寫字母 有時候多個泛型型別時會加上數字,比如t1,t2 常見字母 見名知意 t type k v key value e element 需求 定義學生類,其中有學生成績 整...

第12章 泛型

publicstaticvoidmain string args 1 泛型沒有多型 如果b是a的乙個子型別 子類或者子介面 而g是具有泛型宣告的類或介面,g並不是g的子型別!比如 string是object的子類,但是list並不是list的子類。2 沒有泛型陣列 public class test...

第15章 泛型

具有private構造器的類在該類外部不能new物件,也不能在外部被繼承。內部類中使用 外部類類名.this 表示外部類的this。對於乙個static方法而言,無法訪問泛型類的型別引數 class genericsetter 如果static方法想要使用泛型能力,就必須使之成為泛型方法。定義泛型方...