泛型字母
形式型別引數(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...