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

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳談Java泛型中T和問號(通配符)的區別

詳談Java泛型中T和問號(通配符)的區別

2021-01-27 11:43ikownyou Java教程

下面小編就為大家帶來一篇詳談Java泛型中T和問號(通配符)的區別。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

類型本來有:簡單類型和復雜類型,引入泛型后把復雜類型分的更細了.

概述

泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。這種參數類型可以用在類、接口和方法的創建中,分別稱為泛型類、泛型接口、泛型方法。 Java語言引入泛型的好處是安全簡單。

在Java SE 1.5之前,沒有泛型的情況的下,通過對類型Object的引用來實現參數的“任意化”,“任意化”帶來的缺點是要做顯式的強制類型轉換,而這種轉換是要求開發者對實際參數類型可以預知的情況下進行的。對于強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在運行的時候才出現異常,這是一個安全隱患。

泛型的好處是在編譯的時候檢查類型安全,并且所有的強制轉換都是自動和隱式的,以提高代碼的重用率。

泛型的規則限制

泛型的類型參數只能是類類型(包括自定義類),不能是簡單類型。

同一種泛型可以對應多個版本(因為參數類型是不確定的),不同版本的泛型類實例是不兼容的。

泛型的類型參數可以有多個。

泛型的參數類型可以使用extends語句,例如。習慣上稱為“有界類型”。

泛型的參數類型還可以是通配符類型。例如Class<?> classType = Class.forName(“java.lang.String”);

1、具體例子

下面給出兩個簡單的例子,實現同樣的功能,一個使用了泛型,一個沒有使用泛型。

例子一:使用了泛型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Gen<T> {
 
  private T t;
 
  public Gen(T t){
    this.t = t;
  }
  public T getT() {
    return t;
  }
  public void setT(T t) {
    this.t = t;
  }
 
  public void showType(){
    System.out.println("T的實際類型是:" + t.getClass().getName());
  }
 
  public static void main(String[] args) {
    Gen<Integer> gen = new Gen<Integer>(1);
    gen.showType();
 
    int i = gen.getT();
    System.out.println(" value = " + i);
    System.out.println(" ====================== ");
 
    //定義泛型類Gen的一個String的版本
    Gen<String>strObj = new Gen<String>("Hello Gen!");
    strObj.showType();
    String s = strObj.getT();
    System.out.println(" value = " + s);
 
  }
}

例子二:沒有使用泛型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Gen2 {
 
  // 定義一個通用類型成員
  private Object obj;
 
  public Gen2(Object obj) {
    this.obj = obj;
  }
 
  public Object getObj() {
    return obj;
  }
 
  public void setObj(Object obj) {
    this.obj = obj;
  }
 
  public void showType() {
    System.out.println("T的實際類型是: " + obj.getClass().getName());
  }
 
  public static void main(String[] args) {
    // 定義類Gen2的一個Integer版本
    Gen2 intObj = new Gen2(2);
    intObj.showType();
 
    int i = (Integer) intObj.getObj();
    System.out.println(" value = " + i);
    System.out.println(" ====================== ");
 
    // 定義類Gen2的一個String版本
    Gen2 strOb = new Gen2("Hello Gen!");
    strOb.showType();
    String s = (String) strOb.getObj();
    System.out.println(" value= " + s);
  }
}

2、深入泛型

在Java 5之前,為了讓類有通用性,往往將參數類型、返回類型設置為Object類型,當獲取這些返回類型來使用時候,必須將其“強制”轉換為原有的類型或者接口,然后才可以調用對象上的方法。

泛型和使用“Object泛型”方式實現結果的完全一樣,但是簡單多了,因為不需要強制類型轉換。

泛型類語法:

使用來聲明一個類型持有者名稱,然后就可以把T當作一個類型代表來聲明成員、參數和返回值類型。當然T僅僅是個名字,這個名字可以自行定義。

class GenericsFoo 聲明了一個泛型類,這個T沒有任何限制,實際上相當于Object類型,實際上相當于 class GenericsFoo。

與Object泛型類相比,使用泛型所定義的類在聲明和構造實例的時候,可以使用“<實際類型>”來一并指定泛型類型持有者的真實類型。例如:

?
1
GenericsFoo<Double> douFoo=new GenericsFoo<Double>(new Double("33"));

當然,也可以在構造對象的時候不使用尖括號指定泛型類型的真實類型,但是你在使用該對象的時候,就需要強制轉換了。比如:

?
1
GenericsFoo douFoo=new GenericsFoo(new Double("33"));

實際上,當構造對象時不指定類型信息的時候,默認會使用Object類型,這也是要強制轉換的原因。

3、高級應用

限制泛型

在上面的例子中,由于沒有限制class GenericsFoo類型持有者T的范圍,實際上這里的限定類型相當于Object,這和“Object泛型”實質是一樣的。限制比如我們要限制T為集合接口類型。只需要這么做:
class GenericsFoo,這樣類中的泛型T只能是Collection接口的實現類,傳入非Collection接口編譯會出錯。

多接口限制

雖然Java泛型簡單的用 extends 統一的表示了原有的 extends 和 implements 的概念,但仍要遵循應用的體系,Java 只能繼承一個類,但可以實現多個接口,所以你的某個類型需要用 extends 限定,且有多種類型的時候,只能存在一個是類,并且類寫在第一位,接口列在后面,也就是:

(泛型方法的類型限定)

?
1
<T extends SomeClass & interface1 & interface2 & interface3>

(泛型類中類型參數的限制)

?
1
2
3
public class Demo<T extends Comparable & Serializable> {
  // T類型就可以用Comparable聲明的方法和Seriablizable所擁有的特性了
}

通配符泛型

為了解決類型被限制死了不能動態根據實例來確定的缺點,引入了“通配符泛型”,針對上面的例子,使用通配泛型格式為<? extends Collection>,“?”代表未知類型,這個類型是實現Collection接口。

注意:

如果只指定了<?>,而沒有extends,則默認是允許Object及其下的任何Java類了。也就是任意類。

通配符泛型不單可以向下限制,如<? extends Collection>,還可以向上限制,如<? super Double>,表示類型只能接受Double及其上層父類類型,如Number、Object類型的實例。

泛型類定義可以有多個泛型參數,中間用逗號隔開,還可以定義泛型接口,泛型方法。這些都與泛型類中泛型的使用規則類似。

4、泛型方法

是否擁有泛型方法,與其所在的類是否泛型沒有關系。要定義泛型方法,只需將泛型參數列表置于返回值前。如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class GenericMethod {
 
  public <T> void print(T x) {
    System.out.println(x.getClass().getName());
  }
 
  public static void main(String[] args) {
    GenericMethod method = new GenericMethod();
    method.print(" ");
    method.print(10);
    method.print('a');
    method.print(method);
  }
}

需要注意的是,一個static方法,無法訪問泛型類的類型參數,所以,若要static方法需要使用泛型能力,必須使其成為泛型方法。

泛型的好處如:

開始版本

?
1
2
public void write(Integer i, Integer[] ia);
public void write(Double d, Double[] da);

泛型版本

?
1
public <T> void write(T t, T[] ta);

簡便了代碼

定義泛型

定義在類后面

緊跟類名后面

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

定義泛型 T, S, 且S 繼承 T

定義在方法裝飾符后面

緊跟修飾符后面(public)

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

定義泛型 T, S, 且S 繼承 T

實例化泛型

實例化定義在類上的泛型

第一聲明類變量或者實例化時。例如

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

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

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

實例化定義方法上的泛型

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

通配符(?)

上面有泛型的定義和賦值;當在賦值的時候,上面一節說賦值的都是為具體類型,當賦值的類型不確定的時候,我們用通配符(?)代替了:

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

以上這篇詳談Java泛型中T和問號(通配符)的區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/ikownyou/article/details/65630385

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: hd性欧美俱乐部中文 | 四虎网站入口 | 好姑娘在线观看完整版免费 | 亚洲丰满女人ass硕大 | 肉文高h文 | 动漫美女被褥吸奶漫画漫画 | 美女福利视频午夜在线 | 免费稚嫩福利 | 精品国产乱码久久久久久人妻 | 午夜影院免费体验 | 日韩手机在线视频 | 国产亚洲精品一区久久 | 国产三级精品久久三级国专区 | 色欲麻豆国产福利精品 | 青草视频在线观看免费网站 | 日韩视频在线免费 | 操破苍穹全文阅读 | 欧美人禽杂交狂配无删完整 | 91久久精品青青草原伊人 | 精品国产乱码久久久久久免费 | 公交车强校花系列小说 | 欧美一区二区三区精品 | 午夜熟女插插XX免费视频 | 天堂欧美 | a级情欲片在线观看hd | 亚洲国产成人在人网站天堂 | 成年美女黄网色大观看全 | 国产精品自在线 | 日韩在线免费看 | 午夜伦伦电影理论片费看 | gayrb漫画免费入口 | 久久国产视频网站 | 美女班主任让我爽了一夜视频 | 亚欧成人中文字幕一区 | 99久久精品免费看国产情侣 | 国产区香蕉精品系列在线观看不卡 | www红色一片在线观看版 | 果冻传媒新在线观看免费 | 精品欧美一区二区精品久久 | 3黑人巨大vs北岛玲 3d肉浦团在线观看 3d动漫免费 | 色图片小说 |