?????????
jdk6都出來有一點時間,感覺自己還是停留在jdk4的水平上,今天研究線程的時候,看到資料上的
?????????ExecutorService pool = Executors.newCachedThreadPool();以及class MatchCounter implements Callable<Integer> ,感覺很是奇怪.后來上網找了資料才知道是
Jdk5.0新特性——Generic Types (泛型).
??????? 我就將我理解的大體說一下,大家學習一下.
import?Java.util.Hashtable;?

class?Test?
{?

?public?static?void?main(String[]?args)?
{?
?Hashtable?h?=?new?Hashtable();?
?h.put("key",?"value");?
?String?s?=?(String)h.get("key");?
?System.out.println(s);?
?}?
}? ??????這個我們做了類型轉換,是不是感覺很煩的,并且強制類型轉換會帶來潛在的危險,系統可能會拋一個ClassCastException異常信息。在JDK5.0中我們完全可以這么做,如:
import?java.util.Hashtable;


public?class?Test?
{

????public?static?void?main(String[]?args)?
{
????????Hashtable<String,?Integer>?h?=?new?Hashtable<String,?Integer>();
????????h.put("key",?new?Integer(123));
????????int?s?=?h.get("key");
????????System.out.println(s);
????}
}
??????這里我們使用泛化版本的HashMap,這樣就不用我們來編寫類型轉換的代碼了,類型轉換的過程交給編譯器來處理,是不是很方便,而且很安全。上面是String映射到String,也可以將Integer映射為String,只要寫成HashTable<Integer,String> h=new HashTable<Integer,String>();h.get(new Integer(0))返回value。果然很方便!
????? 從上面有沒有看到有點別扭啊,h.get(new Integer(123))這里的new Integer(123);好煩的,在JDK5.0之前我們只能忍著了,現在這種問題已經解決了,請看下面這個方法。我們傳入一個int這一基本型別,然后再將i的值直接添加到List中,其實List是不能儲存基本型別的,List中應該存儲對象,這里編譯器將int包裝成Integer,然后添加到List中去。接著我們用List.get(0);來檢索數據,并返回對象再將對象解包裝成int。恩,JDK5.0給我們帶來更多方便與安全。

public?void?autoBoxingUnboxing(int?i)?
{?
?ArrayList<Integer>?L=?new?ArrayList<Integer>();?
?L.add(i);?
?int?a?=?L.get(0);?
?System.out.println("The?value?of?i?is?"?+?a);?
}?
??????也許你已經發現在TestGen<K,V>這個泛型類,其中K,V可以是任意的型別。也許你有時候呢想限定一下K和V當然范圍,怎么做呢?看看如下的代碼:
package?jdk5;


public?class?TestGen2<K?extends?String,?V?extends?Number>?
{
????private?V?v?=?null;

????private?K?k?=?null;


????public?void?setV(V?v)?
{
????????this.v?=?v;
????}


????public?V?getV()?
{
????????return?this.v;
????}


????public?void?setK(K?k)?
{
????????this.k?=?k;
????}


????public?K?getK()?
{
????????return?this.k;
????}


????public?static?void?main(String[]?args)?
{
????????TestGen2<String,?Integer>?t2?=?new?TestGen2<String,?Integer>();
????????t2.setK(new?String("String"));
????????t2.setV(new?Integer(123));
????????System.out.println(t2.getK());
????????System.out.println(t2.getV());
????}
}上邊K的范圍是<=String ,V的范圍是<=Number,注意是“<=”,對于K可以是String的,V當然也可以是Number,也可以是Integer,Float,Double,Byte等。
這個是單一的限制,你也可以對型別多重限制,如下:?
?????????class C<T extends Comparable<? super T> & Serializable>
我們來分析以下這句,T extends Comparable這個是對上限的限制,Comparable< super T>這個是下限的限制,Serializable是第2個上限。一個指定的類型參數可以具有一個或多個上限。具有多重限制的類型參數可以用于訪問它的每個限制的方法和域。
?