Java 泛型(最易懂的方式闡述泛型)

2021-07-12 05:19:49 字數 2779 閱讀 7270

來自:

**大濕

**大濕

只要認真看過,基本能很熟悉泛型的特性。泛型是jdk1.5之後出現的,比如jdk1.5之前,但是會出現2個問題

1:向arraylist當中新增物件,新增string和date都可以,但我們的本意是新增string,編譯器不會檢查錯誤,會導致不可預知的錯誤。

2:get()方法得到乙個元素的時候要進行強制型別轉換。

所以泛型的引入很好的解決了這2個問題。

乙個泛型類如下;

class pair

public

void

setfirst(t first)

public e getsecond()

public

void

setsecond(e second)

}

尖括號中的t,e稱為型別變數。

乙個泛型方法的簽名:

public static t getv(t t)

型別變數在方法修飾符的後面,返回值的前面。

jvm中是不存在泛型這一說法的,即編譯器在編譯的時候,將型別變數擦除掉了,換成了bounding type。上面的pair類在編譯後,pair變成這樣了:

class pair

public

void

setfirst(object first)

public object getsecond()

public

void

setsecond(object second)

}

型別擦除帶來的問題:

定義乙個pair的子類

class

extendspair

extends

pair

}

pair

pair

=new extendspair();

pair

.setsecond(new

date());

執行結果是:

我是父類的方法

我是字類的方法

為什麼會是這樣呢?

因為子類自己定義了乙個public void setsecond(date d)

但是從父類繼承了乙個方法是public void setsecond(object d),這是2個不同的方法。當用父類的引用指向子類的例項,然後呼叫詞方法,對於編譯器只會尋找父類的那個方法即public void setsecond(object d)。而程式設計師的意圖是呼叫子類的方法public void setsecond(date d),所以此種情況,編譯器會為我們生成乙個橋方法

public void setsecond(object d)

所以正如結果中那樣,先呼叫父類的setsecond方法,然後在此方法中呼叫子類的setsecond方法。

1.型別限定符,用關鍵字extends表示子型別限定

對於下面方法

public people getname(pairp)
這個方法,我們無法傳入pair型別的引數,此時我們就要用到子型別限定,將此方法改為:

public people getname(pair<? extends people,? extends people> p)
用關鍵字super表示超型別限定,<?>表示無型別限定。比如乙個方法getpairs()我們要返回pair<>。其中的元素有pair,還有pairstudent和scientist不存在繼承關係。這是就只能用<?>

2:型別限定注意事項:

看下面**

public people getname(pair<? extends people,? extends people> p)
p.setfirst(student)會報錯,因為pair

public

void

setfirst(<? extends people first)

形參是people的某子類,但是編譯器不能確定student是不是這個子類的子類。但是對於get方法,總能將返回型別轉型成people類。相應的使用超型別限定,get()方法會報錯。

1:不能在泛型類的靜態上下文中定義含有型別變數的靜態成員,如:
class

pair

,e>

3:泛型陣列是不合法的
不能建立這樣的陣列:

pair pairs=new pair[10];
因為實際上paris是pair型別的,所以我們新增date型別的元素,編譯器是不會發現的。這會產生難以定位的錯誤。但是我們可以用下面的方式來定義泛型陣列。

pair pairs=(pair)(new pair[10]);
4:不能例項化型別變數
不能出現 new t(),new t這樣的src。因為經過型別擦除後,t均變為boundingtype。這樣的操作沒有意義。

5:型別變數不能是raw型別。

**大濕

JAVA 泛型類,限制泛型和泛型方法

我在學習集合的時候對泛型還不太了解,只是覺得用了泛型之後能向自己的集合裡加入自己指定型別的物件,可以減少資料型別的轉換。那麼,脫離集合後,泛型到底該如何使用。今天碰巧看了一段關於泛型的講解,覺得泛型也沒有自己想象中那麼難,於是將自己的心得分享出來,希望能幫到有需要的人。泛型的知識點大概有 泛型類,限...

Java基礎 泛型 泛型介面 泛型類 泛型方法

一 二 三 泛型方法 1.public t test t t1,t t2 一 泛型 1.泛型產生的背景 原因1 集合中儲存資料時,編譯期間可以儲存任何型別的資料,導致取值時轉換出錯 原因2 每次取值都需要強制轉換,冗餘繁瑣 2.泛型的定義 泛型的本質是乙個引數化的型別 在程式編碼中一些包含引數的類 ...

Java泛型總結(集合泛型 方法泛型 萬用字元)

1,泛型的限定 public static void main string args swap new string,1,2 swap new integer,2,3 泛型引數必須為引用型別 2,泛型方法 泛型類定義的反應,在整個類中有效,如果被方法使用,那麼泛型類的物件明確要操作的具體型別後,所...