第12章 泛型

2021-09-27 08:28:45 字數 3680 閱讀 4638

泛型字母

形式型別引數(formal type parameters)即泛型字母

命名:泛型字母可以隨意指定,盡量使用單個的大寫字母(有時候多個泛型型別時會加上數字,比如t1,t2)

常見字母(見名知意)

t:type

k v:key value

e:element

需求:定義學生類,其中有學生成績

整數小數

字串「優秀、良好、合格、不及格」

classstudent

publicstudent(string

name

, t

score

)publicstring getname()

publicvoidsetname(string

name

)publict getscore()

publicvoidsetscore(t

score

) @override

publicstring tostring() }

publicclassteststudentscore }

宣告時的要點

在類/介面上宣告的泛型,在本類或本介面中即代表某種型別,可以作為非靜態屬性的型別、非靜態方法的引數型別、非靜態方法的返回值型別

在類/介面上宣告的泛型不能使用在靜態成員上

泛型類的構造器如下:public genericclass(){}。

而如下是錯誤的:public genericclass(){}

泛型類在宣告時還可以指定泛型的上限

packagecom.atguigu.generic.classtype;

publicclasstestperson }

/*class human*/

classpersonextendsperson>

classmanextendsperson

classwomanextendsperson

classdog

指定時的要點

當類或介面被使用時,會使用具體的實際型別引數(actual type argument)代替

泛型的指定中不能使用基本資料型別,可以使用包裝類替換

泛型如果不指定,將被擦除,泛型對應的型別均按照object處理,但不等價於object

例如:(1)arraylistlist = new arraylist();   宣告集合變數或建立集合物件,指定泛型

(2)class dog implements comparable   實現介面時,指定泛型

(3)public void test(arraylistlist){}      使用泛型類或介面作為形參時,此處指定為學生型別

(4)public void test(arraylist<?> list){}            使用泛型類或介面作為形參時,此處指定為任意型別

(5)public void test(arraylist<? extends person>  使用泛型類或介面作為形參時,此處指定為person或其子類

(6)public void test(arraylist<? super son>      使用泛型類或介面作為形參時,此處指定為son或其父類

關於泛型類/介面的繼承/實現說明

父類有泛型,子類可以選擇保留泛型也可以選擇指定泛型型別:

子類不保留父類的泛型:按需實現

沒有型別  擦除

具體型別

子類保留父類的泛型:泛型子類

全部保留

部分保留

結論:子類必須是「富二代」,子類除了指定或保留父類的泛型,還可以增加自己的泛型

classfather

//子類不保留父類的泛型

//1)

沒有型別  擦除

classsonextendsfather

//2)

具體型別

classson2extendsfather

//子類保留父類的泛型

//1)

全部保留

classson3extendsfather

//2)

部分保留

classson4extendsfather

classfather

//子類不保留父類的泛型

//1)

沒有型別  擦除

classsonextendsfather

//2)

具體型別

classson2extendsfather

//子類保留父類的泛型

//1)

全部保留

classson3extendsfather

//2)

部分保留

classson4extendsfather

具體示例**

classdogimplementscomparable }

classcatimplementscomparable }

classmysetimplementscollection

...... }

關於泛型的擦除說明

使用泛型類時未指定泛型的具體型別:類似於object,不等同於object

泛型擦除,預設按照object處理但編譯不會型別檢查

明確指定object,編譯會按object型別檢查

publicclasstestgenericerasure

publicstaticvoidtest(arraylist

list

) system.out

.println(

"元素:"

+str

); } }

第12章 泛型

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

第12章 泛型

泛型 generic 是clr和程式語言提供的一種特殊機制,它支援另一種形式的 重用,即演算法重用。簡單的說,開發人員先定義好乙個演算法,比如排序 搜尋 交換 比較或者轉換等。但是,定義演算法的開發人員並不設定該演算法要操作什麼資料型別。該演算法可以廣泛地應用於不同型別的物件。然後,另乙個開發人員,...

第9章 泛型

增加了泛型支援後的集合,完全可以記住集合中元素的型別,並可以在編譯時檢查集合中元素的型別,如果試圖向集合中新增不滿足型別要求的物件,編譯器就會提示錯誤。建立的方法是 在集合介面 類後增加尖括號,尖括號裡放乙個資料型別,如 liststr new arraylist 對於後面的 系統會自動識別為str...