Java基礎再學習之泛型

2021-08-25 15:34:23 字數 2977 閱讀 7172

泛型在jdk1.5出來的,以為自己很理解它了,至少看看**,寫寫基本的沒有問題。

由於是個新事物,對於我這種從jdk1.1過來的人來說還是乙個思維上的跳躍。最近寫了一些**,好好整理了一下。

[b]為什麼會出現泛型[/b]

我喜歡事事問為什麼,要不然就覺得心裡不踏實。

我已經不止一次的提到過,任何的新技術的出現都是伴隨著解決乙個問題來的。

那泛型解決了什麼?

我們記得在以前的編碼過程中,exception中無非就那幾種是比較常見和頭疼的。第一大非nullpointerexception莫屬了,我就不多說了,接著就是classcastexception,因為我們的**中往往為了所謂的擴充套件性(可能是過度設計產生的),用了很多object類作為引數輸入,沒有泛型之前,我們的處理方法是到處用強制轉換,如果保險點就加很多的instanceof.所以這個class型別匹配要多煩有多煩。

好了,泛型來了,它的最大特點就是要規範你的編碼風格,不允許你亂定義你的型別,用錯了就編譯不過,不用就給你乙個警告,哈哈。

總之,泛型的作用就是使**得到的訊號型別一致,從而使行為一致。

[b]怎麼要使用泛型[/b]

泛型分為兩步:申明 + 使用

申明:兩個個地方可以申明,類定義中申明,方法定義申明。(有人提出三個地方,介面定義,但是我想介面也是類嘛)

為什麼就這兩個地方?有什麼好處?

如下類定義中申明了乙個t型別,這樣就可以在這個類中的任何地方用這個t作為型別,就像一輛車,框架有了,但是什麼材料做的不知道,可以是鐵的,也可以是鋁的,所以我們就用」材料t「

來代替材料型別。

public class car{}

那怎麼使用這個材料t泛型呢?如果我們new car的時候不指定材料t的具體,是無法造出汽車的,巧婦難為無公尺之炊啊。所以我們使用泛型的時候就需要具體化它。

public class fe extends metal{}

public class al extends metal{}

carcar1=new car();

carcar2=new car();

這樣車車就造出來了,很酷吧?

但是上述有個不爽的地方就是,每次造車的時候必須告訴它是什麼材質的,但是有時候我們根本不關心材質的情況下,就顯得多餘了。比如我要知道每一種車的顏色而不是材質。如果我們按照上述的類申明的泛型,那麼可以在class定義後面加個顏色s的泛型(支援逗號),但是如果下次不要顏色,要尺寸,我是不是還要加個尺寸泛型m?

是不是很多啊,所以我想除了一些基本的型別外,其他區域性的特性就不用放在類申明裡面了,可以放在方法申明裡面,怎麼做呢?請看

public class car

public void setcolor(s s)

}

其中的s是專屬於方法的,這個方法還可以是static的。

那怎麼使用呢?很簡單,如下:

public class red extends color{}

car car3=new car();

car3.setcolor(new red());

[b]核心思想[/b]

說了這麼多,我想泛型的核心思想就是規範類和方法的行為。只要兩個類或者方法有相同的邏輯,哪怕是一點點相像的地方,我們都可以用乙個泛型定義來申明它,這樣就使得**十分簡潔安全。

在這裡我要提一下複雜關係情況下的泛型。因為任何技術總是原理簡單,到複雜環境下就喪失理智,摸不著頭腦。

舉個例子:父母--子女--性別

父母有子女,子女有性別

如果不用泛型,我們會分別對男孩,女孩分別寫邏輯和類。

比如:

public static class gender{}

public static class male extends gender{}

public static class female extends gender{}

public static class child

public static class boy extends child{}

public static class girl extends child{}

public static class father

public girl getgirl()

public void setboy(boy boy)

public void setgirl(girl girl)

}

是不是覺得兩個get/set方法結構一樣,但是非要實現,而且方法名字必須不一樣,因為類過載不能以返回值來區分。

如果用泛型,就簡單清晰了。

首先申明:

public inte***ce child{}

指定child,但是性別不知道,所以用了「性別g」來代替

接著

public class father>

public listgetchildren()

}

指定了father,但是不知道子女是男孩還是女孩,所以用了"孩子c"來代替,並且extends child,意思是至少我知道是個孩子,孩子裡面還有個?號,意思是我知道是個孩子,但是我不知道孩子是男是女。

好了,申明好了,接著我們就開始用了。

fathe***ther1=new father();

fathe***ther2=new father();

father1.addchild(new boy());

father2.addchild(new girl());

是不是很簡潔?

這就是物件導向語言的魅力。

java學習之泛型

泛型 jdk1.5後出現的安全機制。好處 1 將執行時期的問題classcastexception轉到了編譯時期。2 避免了強制轉換的麻煩。什麼時候使用?當操作的引用資料型別不確定的時候,就使用 將要操作的引用資料型別傳入即可。其實 就是乙個用於接收具體引用資料型別的引數範圍。在程式中,只要用到了帶...

JAVA基礎之泛型程式設計

一 什麼是泛型?所謂的泛型是指 允許在定義類 介面 方法時使用型別引數,這個型別引數將在 宣告變數 建立物件 呼叫方法時動態地指定。泛型類相當於乙個模板,在編譯期無法確定具體的型別,只有在建立物件時候需要動態指定具體的型別。注意點 1 泛型不能用在靜態屬性上 2 泛型使用時要傳入具體的引用資料型別 ...

java基礎之泛型詳解

public class a public t get 當使用者建立a類物件時,就會給a類的型別變數t賦值。如new a 這說明a類中所有的t都會被string替換。public class a public string get 泛型類說明這個類有型別變數,在建立這個類物件時需要給型別變數賦值。泛...