對於泛型的詳細理解

2021-10-03 20:02:11 字數 3037 閱讀 6625

泛型的本質:

在理解泛型本質的同時不妨先了解下形參和實參,我們在定義方法時或是api中的很多方法都會有形參,然後呼叫該方法時再傳入符合方法要求的實參。

例如arraylist中的此方法,該方法中就有乙個int型別的形參,然後呼叫該方法的時候再傳入int型別的實參。

泛型其實也是一樣,在定義類,介面,方法時就定義了乙個泛型,實際上就是將資料型別引數化,然後我們在使用的時候再將具體資料型別傳入,傳入具體型別後,之前使用泛型的地方就會自動變為傳入的具體型別,我們也可以選擇不傳入,如果不傳入泛型,用到泛型的地方就可以是任何型別。

泛型主要應用於泛型類,泛型介面,泛型方法,現在我們先針對泛型類為上述舉例子。

(一)泛型類(建立後,在例項化類的時候指明泛型的具體型別,但也可以不指明):首先建立乙個泛型類。

public class denifition

public t getid()

public void setid(t id)

public t getname()

public void setname(t name)

public int getage()

public void setage(int age)

@override

public string tostring() ';}}

①如果傳入實參,即傳入具體資料型別會怎麼樣

public class denifitiontext 

-----------------------------------

// 如果把其他型別的值賦給name和id就會報錯。

denifitiond = new denifition();

d.id = 1551;

d.name = sdsd;

d.age = 15;

system.out.println(d);

//編譯後系統報錯。}}

②如果不傳入實參,結果會怎麼樣

public class denifitiontext }}

注意a.泛型的型別引數只能是類型別(也可以是陣列型別,但是幾乎用不到),不能是基本資料型別。

b.使用instanceof的時候不可宣告泛型,否則會報錯。

c.③注意:定義泛型類的時候,泛型類中的方法不能對泛型變數使用算術運算子進行任何運算,否則會報錯。d.泛型類可以定義多個泛型,這裡不做贅述。

public boolean equals(object obj) 

return start;

}//編譯程式會報錯

/**instanceof就是用於判斷傳入的物件型別真身是否是指定型別,

後面沒有必要加上泛型,去掉泛型後,程式正常,呼叫equals

的物件與比較物件無論泛型是否相同,只要符合方法判斷就會

報true*/

//定義泛型類時,未對泛型類中的方法的泛型變數使用算術運算子,編譯正確。

public void add(t a,t b,int c,int d)

(二)泛型介面(建立後,在實現介面的時候指明泛型的具體型別,但也可以不指明)

泛型介面與泛型類的主要區別是:如果未傳入泛型實參,在實現泛型介面的時候,類也需要宣告泛型,如果不在類中宣告泛型,編譯器就會報錯,如果傳入了泛型引數,類中就無需宣告泛型了。

定義乙個泛型介面

public inte***ce diy
①未傳入型別引數需要在類中也宣告泛型

public class diytestimplements diy

//編譯正常

②未傳入引數未在類中宣告泛型會怎麼樣

public class diytest implements diy

//編譯器報錯

③注意:a.定義泛型介面的時候,同定義泛型類一樣,不能對方法中的泛型變數使用算術運算子。b.泛型介面和泛型類一樣都可以定義多個泛型,這裡不做贅述。

public void next(t a, t b, int c) 

//統統報錯

(二)傳入實參

public class diytest implements diy

//編譯正常

注意:若傳入實參,就不要對類進行宣告泛型的操作了,否則在進行運算的時候可能還會造成錯誤,如下:

public class diytestimplements diy

//程式報錯

有關集合泛型類的注意:自定義泛型類和介面都是先定義泛型類和介面,然後再例項化或是實現的時候傳入具體型別,傳入後泛型就會變為指定型別,也可以不傳入,不傳入的話,類和介面裡面的變數就可以為任何型別。

api中有很多泛型類,如集合類,集合類通常用於建立集合(也是一種物件),和自定義泛型不同,給集合類傳入了泛型實參後,該集合就只能儲存泛型變數了。

新手容易產生的誤解:

①定義泛型後,類中所有資料都只能是此泛型(×)。只是自己定義了乙個泛型罷了,對資料起限制作用,類中可以有各種資料型別的變數。

②泛型變數不能轉型(×)泛型變數是可以轉型的。

(三)泛型方法(在呼叫方法的時候指明泛型的具體型別)

只有宣告了泛型的方法才是泛型方法,類中那些使用了泛型變數的並不是泛型方法。

還未學到,待總結。

新手總結,如有錯誤,歡迎指正。

c 對於委託,事件,泛型的理解

1.委託 我對委託的理解是乙個公共資源,可以把委託比作外賣小哥,外賣小哥可以幫商家a送貨,也可以幫商家b送貨,並且這些商家也不需要知道買他們東西的人的住址,這個送貨的過程就是交給外賣小哥去做的。這樣的話,分工很明確,自然整個過程的效率也提高了。委託是一種型別 委託型別 同意需要定義,例項化,之後才能...

泛型的理解

泛型是編譯器層面上的而不是虛擬機器上的,虛擬機器上不存在泛型.x.可以使用泛型的有 類,介面和方法.泛型方法可以直接定義在普通類中 方法的如下 public t gett t t public static extends abc t gett t t 是必須存在的,可以限定返回值和引數tx.泛型在...

關於泛型,什麼是泛型,如何理解泛型

泛型是jdk5中引入的特性,它提供了編譯時型別安全檢測機制,該機制允許在編譯時檢測到非法的型別,就不至於在執行時出現轉換異常,它的本質是引數化型別 即以任何型別 t 作為引數,在使用時可以傳入型別t的具體值 t 也就是將型別由原來的具體型別用引數t表示 即型別引數化 然後在使用 呼叫時傳入具體的型別...