泛型在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 泛型類說明這個類有型別變數,在建立這個類物件時需要給型別變數賦值。泛...