JAVA從入門到高階(十) 泛型

2021-09-10 23:40:06 字數 3526 閱讀 4722

一:

泛型是在jdk1.5版本出現的安全機制。

為什麼需要泛型?

1.將執行時期的問題classcastexception轉化到編譯問題。

2.避免了強制轉化的麻煩。

public class genneticdemo1
在執行編譯時的語句是丟擲了型別轉換異常,我們就可以借助泛型來完成。

泛型,即「引數化型別」。一提到引數,最熟悉的就是定義方法時有形參,然後呼叫此方法時傳遞實參。那麼引數化型別怎麼理解呢?

顧名思義,就是將型別由原來的具體的型別引數化,類似於方法中的變數引數,此時型別也定義成引數形式(可以稱之為型別形參),

然後在使用/呼叫時傳入具體的型別(型別實參)。

泛型的本質是為了引數化型別(在不建立新的型別的情況下,通過泛型指定的不同型別來控制形參具體限制的型別)。也就是說在泛型使用過程中,操作的資料型別被指定為乙個引數,這種引數型別可以用在類、介面和方法中,分別被稱為泛型類、泛型介面、泛型方法。

什麼時候用泛型呢?

當操作的引用資料型別不確定的時候就使用泛型,將要操作的引用資料型別傳入即可。其實泛型就是乙個用於接受具體應用資料型別的引數範圍。

public class genneticdemo1 	}

}採用泛型寫法後,在//1處想加入乙個integer型別的物件時會出現編譯錯誤,通過

list,直接限定了list集合中只能含有string型別的元素,從而在//2處無須進

行強制型別轉換,因為此時,集合能夠記住元素的型別資訊,編譯器已經能夠確認

它是string型別了。

泛型是用於編譯時期,確保了型別的安全。執行時,會將泛型擦除在生成的class檔案是不帶泛型的。在後期會有泛型的補償機制,不需要再進行強制型別轉換。

二:泛型的基本用法

1.泛型類

class box

public void setdata(t data)

public box(t data)

public box() }

public class genneticdemo2

}

由此,我們發現,在使用泛型類時,雖然傳入了不同的泛型實參,但並沒有真正意義上生成不同的型別,傳入不同泛型實參的泛型類在記憶體上只有乙個,即還是原來的最基本的型別(本例項中為box),當然,在邏輯上我們可以理解成多個不同的泛型型別。也就是說,成功編譯過後的class檔案中是不包含任何泛型資訊的。泛型資訊不會進入到執行時階段。

2.泛型介面

兩種實現方式;①是在子類明確例項化的型別②是繼續使用泛型來實現介面

inte***ce gendemo1

class demo1 implements gendemo1

}class demo3 implements gendemo1

}

3.泛型方法

void show_1(t t)

//在泛型類中宣告了乙個泛型方法,使用泛型e,這種泛型e可以為任意型別。可以型別與t相同,也可以不同。

//由於泛型方法在宣告的時候會宣告泛型,因此即使在泛型類中並未宣告泛型,編譯器也能夠正確識別泛型方法中識別的泛型。

public void show_3(e t)

//在泛型類中宣告了乙個泛型方法,使用泛型t,注意這個t是一種全新的型別,可以與泛型類中宣告的t不是同一種型別。

public void show_2(t t)

}public static void main(string args)

}

②靜態方法

當方法靜態時,不能使用類上定義的泛型,如果靜態方法需要用到泛型,就定義為靜態泛型方法。

原因:靜態方法不需要物件來進行,而類上定義的泛型需要指定物件。

```

public class staticgenerator,此時編譯器會提示錯誤資訊:

"staticgenerator cannot be refrenced from static context"

*/public static void show(t t)

}

三 萬用字元?

型別萬用字元一般是使用 ? 代替具體的型別實參。注意了,此處是型別實參,而不是型別形參!且box<?>在邏輯上是box、box…等所有box《具體型別實參》的父類。由此,我們依然可以定義泛型方法,來完成此類需求。

1 public class generictest 

13 14 public static void getdata(box<?> data)

17 18 }

class person

public person()

public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

@override

public string tostring() }

public class genneticdemo4

public static void collectionoutput(collection<?> coll)

}}

四 泛型上限,下限

在使用泛型的時候,我們還可以為傳入的泛型型別實參進行上下邊界的限制,如:型別實參只准傳入某種型別的父類或某種型別的子類。

結果:為泛型新增上邊界,即傳入的型別實參必須是指定型別的子型別

public void showkeyvalue1(generic<? extends number> obj)

genericgeneric1 = new generic("11111");

genericgeneric2 = new generic(2222);

genericgeneric3 = new generic(2.4f);

genericgeneric4 = new generic(2.56);

//這一行**編譯器會提示錯誤,因為string型別並不是number型別的子類

//showkeyvalue1(generic1);

showkeyvalue1(generic2);

showkeyvalue1(generic3);

showkeyvalue1(generic4);

如果我們把泛型類的定義也改一下:

public class generic

public t getkey()}

//這一行**也會報錯,因為string不是number的子類

genericgeneric1 = new generic("11111");

我們通常在集合中使用泛型,在開發中使用泛型會是**更加簡潔。

Java泛型入門

一 為什麼要用泛型?什麼是泛型?泛型好處都有啥,誰說對了就 隨便引一篇文章 二 主要談用法 1 泛型類 修飾符 class 類名 泛型名1,泛型名2,2 泛型介面 修飾符 inte ce 類名 泛型名1,泛型名2,3 泛型方法 修飾符 泛型名1,泛型名2,返回型別 方法名 引數列表 4 泛型默繼承o...

SD WAN十問,帶你從入門到高階

近年來,sd wan發展勢頭強勁,越來越多的企業使用者紛紛著手開始部署sd wan,sd wan市場繼續呈 式增長,並被各種分布式的組織廣泛採用,除了原有的mpls鏈路之外,企業還可以輕鬆部署sd wan產品,並在部署網際網路連線時大幅改善wan頻寬。sd wan的市場份額很高,很多初創公司 小的 ...

Java高階 java基礎(二) 泛型

泛型就是引數化型別 適用於多種資料型別執行相同的 泛型中的型別在使用時指定 泛型歸根到底就是 模版 泛型的本質是為了引數化型別 在不建立新的型別的情況下,通過泛型指定的不同型別來控制形參具體限制的型別 使用泛型的優點 使用泛型時,在實際使用之前型別就已經確定了,不需要強制型別轉換 避免無畏的強制型別...