一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 初步理解Java的泛型特性

初步理解Java的泛型特性

2020-03-01 11:31phoenix007 JAVA教程

這篇文章主要介紹了Java的泛型特性,是Java入門學習中的基礎知識,需要的朋友可以參考下

在Java SE1.5中,增加了一個新的特性:泛型(日本語中的總稱型)。何謂泛型呢?通俗的說,就是泛泛的指定對象所操作的類型,而不像常規方式一樣使用某種固定的類型去指定。泛型的本質就是將所操作的數據類型參數化,也就是說,該數據類型被指定為一個參數。這種參數類型可以使用在類、接口以及方法定義中。
 
一、為什么使用泛型呢?
     在以往的J2SE中,沒有泛型的情況下,通常是使用Object類型來進行多種類型數據的操作。這個時候操作最多的就是針對該Object進行數據的強制轉換,而這種轉換是基于開發者對該數據類型明確的情況下進行的(比如將Object型轉換為String型)。倘若類型不一致,編譯器在編譯過程中不會報錯,但在運行時會出錯。
    使用泛型的好處在于,它在編譯的時候進行類型安全檢查,并且在運行時所有的轉換都是強制的,隱式的,大大提高了代碼的重用率。
 
二、定義&使用
 類型參數的命名風格為:
 推薦你用簡練的名字作為形式類型參數的名字(如果可能,單個字符)。最好避免小寫字母,這使它和其他的普通
 的形式參數很容易被區分開來。
 使用T代表類型,無論何時都沒有比這更具體的類型來區分它。這經常見于泛型方法。如果有多個類型參數,我們
 可能使用字母表中T的臨近的字母,比如S。
 如果一個泛型函數在一個泛型類里面出現,最好避免在方法的類型參數和類的類型參數中使用同樣的名字來避免混
 淆。對內部類也是同樣。
 
1.定義帶類型參數的類
 在定義帶類型參數的類時,在緊跟類命之后的<>內,指定一個或多個類型參數的名字,同時也可以對類型參數的取
 值范圍進行限定,多個類型參數之間用,號分隔。
 定義完類型參數后,可以在定義位置之后的類的幾乎任意地方(靜態塊,靜態屬性,靜態方法除外)使用類型參數,
 就像使用普通的類型一樣。
 注意,父類定義的類型參數不能被子類繼承。

?
1
2
3
public class TestClassDefine<T, S extends T> {
  ....
}

 
2.定義待類型參數方法
 在定義帶類型參數的方法時,在緊跟可見范圍修飾(例如public)之后的<>內,指定一個或多個類型參數的名字,
 同時也可以對類型參數的取值范圍進行限定,多個類型參數之間用,號分隔。
 定義完類型參數后,可以在定義位置之后的方法的任意地方使用類型參數,就像使用普通的類型一樣。
 例如:

?
1
2
3
public <T, S extends T> T testGenericMethodDefine(T t, S s){
  ...
}

 注意:定義帶類型參數的方法,騎主要目的是為了表達多個參數以及返回值之間的關系。例如本例子中T和S的繼
 承關系, 返回值的類型和第一個類型參數的值相同。
 如果僅僅是想實現多態,請優先使用通配符解決。通配符的內容見下面章節。

?
1
2
3
public <T> void testGenericMethodDefine2(List<T> s){
  ...
}

 應改為

?
1
2
3
public void testGenericMethodDefine2(List<?> s){
  ...
}

 
3. 類型參數賦值
 當對類或方法的類型參數進行賦值時,要求對所有的類型參數進行賦值。否則,將得到一個編譯錯誤。
 
4.對帶類型參數的類進行類型參數賦值
 對帶類型參數的類進行類型參數賦值有兩種方式
 第一聲明類變量或者實例化時。例如

?
1
2
List<String> list;
list = new ArrayList<String>;

 第二繼承類或者實現接口時。例如

?
1
public class MyList<E> extends ArrayList<E> implements List<E> {...}

 
5.對帶類型參數方法進行賦值

 當調用范型方法時,編譯器自動對類型參數進行賦值,當不能成功賦值時報編譯錯誤。例如

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public <T> T testGenericMethodDefine3(T t, List<T> list){
  ...
}
public <T> T testGenericMethodDefine4(List<T> list1, List<T> list2){
  ...
}
 
Number n = null;
Integer i = null;
Object o = null;
testGenericMethodDefine(n, i);//此時T為Number, S為Integer
testGenericMethodDefine(o, i);//T為Object, S為Integer
 
List<Number> list1 = null;
testGenericMethodDefine3(i, list1)//此時T為Number
 
List<Integer> list2 = null;
testGenericMethodDefine4(list1, list2)//編譯報錯

 
6.通配符
 在上面兩小節中,對是類型參數賦予具體的值,除此,還可以對類型參數賦予不確定值。例如

?
1
2
3
List<?> unknownList;
List<? extends Number> unknownNumberList;
List<? super Integer> unknownBaseLineIntgerList;

 注意: 在Java集合框架中,對于參數值是未知類型的容器類,只能讀取其中元素,不能像其中添加元素,
 因為,其類型是未知,所以編譯器無法識別添加元素的類型和容器的類型是否兼容,唯一的例外是NULL

?
1
2
3
4
List<String> listString;
List<?> unknownList2 = listString;
unknownList = unknownList2;
listString = unknownList;//編譯錯誤

 
7.數組范型

 可以使用帶范型參數值的類聲明數組,卻不可有創建數組

?
1
2
List<Integer>[] iListArray;
new ArrayList<Integer>[10];//編譯時錯誤

 
三、擴展
1、extends語句

使用extends語句將限制泛型參數的適用范圍。例如:
<T extends collection> ,則表示該泛型參數的使用范圍是所有實現了collection接口的calss。如果傳入一個<String>則程序編譯出錯。
2、super語句
super語句的作用與extends一樣,都是限制泛型參數的適用范圍。區別在于,super是限制泛型參數只能是指定該class的上層父類。
例如<T super List>,表示該泛型參數只能是List和List的上層父類。
3、通配符
使用通配符的目的是為了解決泛型參數被限制死了不能動態根據實例來確定的缺點。
舉個例子:public class SampleClass < T extends S> {…}
假如A,B,C,…Z這26個class都實現了S接口。我們使用時需要使用到這26個class類型的泛型參數。那實例化的時候怎么辦呢?依次寫下

?
1
2
3
4
SampleClass<A> a = new SampleClass();
SampleClass<B> a = new SampleClass();
SampleClass<Z> a = new SampleClass();

這顯然很冗余,還不如使用Object而不使用泛型,呵呵,是吧?
別著急,咱們使用通配符,就OK了。

?
1
SampleClass<? Extends S> sc = new SampleClass();

 
只需要聲明一個sc變量,很方便把!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜影院免费观看视频 | 久99视频精品免费观看福利 | 日本成熟bbxxxxxxxx | 狠狠涩| 国产女主播在线播放一区二区 | kkkk4444在线看片 | 欧美一级免费看 | 国产成人精品午夜在线播放 | 精品日韩一区二区三区 | 99资源站| 男人插女人软件 | h日本漫画全彩在线观看 | 午夜亚洲WWW湿好大 午夜想想爱 | 青草草产国视频 | 喜欢老头吃我奶躁我的动图 | 欧美日韩国产亚洲一区二区 | 全彩孕交漫画福利啪啪吧 | 校花被老头夺去第一次动图 | 男人晚上看的 | 天天爱天天操天天射 | 亚洲欧美专区精品伊人久久 | 男女性刺激爽爽免费视频 | 欧美一区二区三区成人看不卡 | 11 13加污女qq看他下面 | 猫咪社区免费资源在线观看 | 羞羞一区二区三区四区片 | 星空无限传媒视频在线观看视频 | kuaibo成人播放器| 桥本有菜ssni-677在线观看 | 7777奇米四色| 热热影院| 午夜国产精品福利在线观看 | 四虎影视884aa·com | 深夜福利影院 | 3x免费高清视频 | 毛片在线免费视频 | 日本老妇和子乱视频 | 人性本色 | 男生和女生艹逼 | 免费在线电视 | 国产成人影院一区二区 |