泛型 泛型類 泛型方法 泛型擦除

2021-10-14 06:56:44 字數 1740 閱讀 1639

(1)是什麼?

一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。

(2)為什麼要用泛型?

泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高**的重用率,減少冗餘編碼。

(3)泛型與object的區別?

像上面說的我不知道方法a的引數型別,其實也可以使用object,但是使用object出參的時候返回的也是object,導致範圍非常廣泛, 返回值也許是其它型別。就會在執行時得到乙個型別轉換異常(classcastexception: xx can not be cast to ***.class);使用泛型的話避免了object的強轉型問題,同時泛型在編譯期會被擦除,轉換成具體的型別,保證了型別安全性。

例如:public object test(object obj){}

public t test( t t ){}

方法一呼叫時候必須強轉型:user user = (user) xx.test( param );

方法二可以:user user = xx.test( param );

(4)什麼是型別擦除?

jvm提供的針對資料型別的處理機制,編譯階段會把泛型轉成對應的型別進行校驗。

擦除規則是:

(1)如果泛型沒有制定具體型別,預設使用object做原始型別。

(2)如果泛型有繼承關係限定型別,則拿父類做原始型別。

(3)如果有多層關係,例如a是b兒子,b又是c兒子,則拿a做原始型別。

型別擦除只會判斷最外層的型別,對於內部巢狀的型別無法判斷:

其實好理解,萬一你物件裡面還套個list之類的,深層巢狀其實對編譯期是很難判斷的

(5)怎麼用?

// 定義泛型類

class

test

public

void

say1()

public

void

say2

(t x)

// 這裡使用的泛型是該靜態方法自己宣告的泛型

public

static

e gettest

(e e)

// 這裡使用的泛型是類宣告的泛型

public t gettest2

(t e)

}

直接寫乙個main,呼叫:
public

static

void

main

(string[

] args)

throws exception

檢視結果:

注意!(1)靜態泛型方法在返回值前加上來表示泛型變數,因為靜態方法不依賴類的初始化,如果不自己宣告泛型變數會編譯出錯!

(2)泛型方法定義要在返回值型別前面加

public

void

say2

(c x)

(3)泛型類定義要在類名後面加,同時增加有參構造。

泛型 (2)泛型類 泛型方法 泛型介面

一 泛型類 定義person類 package cn.itcast.p2.bean public class person implements comparable public person string name,int age public int compareto person p ov...

泛型類,泛型方法,泛型介面

泛型,就是一種不確定的資料型別。如果在類後面加上 這個類就變成了泛型類。這個 t可以使用任意的字母代替。表示定義了一種不確定的資料型別,這種不確定的資料型別必須在使用這個類 比如建立物件 的時候才能確定下來。如果希望縮小泛型的範圍,延後泛型的確定時間,讓泛型在呼叫方法的時候確定,那麼我們可以使用泛型...

泛型類泛型方法

泛型定義 操作的資料型別被指定為乙個引數,將原來的具體資料資料型別引數化。泛型類 1.泛型引數必須是引用資料型別 2.不能 new t 例如可以 this.element t new object 來強制轉換 3.不能 new t 4建立例項物件時忘寫 t 預設為object 例如 myarrayl...