泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。
比如,有一種類型為List,此時該List可以是任意類型的列表,如Integer,String等等。
如果把List類型改為List<Integer>,則此時只表示整型的列表。
這就是所謂的將操作的數據類型指定為一個參數,這等同於C++里面的模板(template)。
那么這么做有什么好處呢?
比如原來我們有如下的程序:
List myIntList = new LinkedList();// 1
myIntList.add(new Integer(0));// 2
Integer x = (Integer) myIntList.iterator().next();// 3
在第三行中進行了強制類型轉換。這個類型轉換不僅僅帶來了混亂,它還可能產生一個運行時錯誤(run time error),因為程序員可能會犯錯。
程序員如何才能明確表示他們的意圖,把一個list中的內容限制為一個特定的數據類型呢?這是generics背后的核心思想。這是上面程序片斷的一個泛型版本:
List<Integer> myIntList = new LinkedList<Integer>(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = myIntList.iterator().next(); // 3
注意變量myIntList的類型聲明。它指定這不是一個任意的List,而是一個Integer的List,寫作:List<Integer>。我們說List是一個帶一個類型參數的泛型接口(a generic interface that takes a type parameter),本例中,類型參數是Integer。我們在創建這個List對象的時候也指定了一個類型參數。
另一個需要注意的是第3行沒了類型轉換。
一句話:就是 給容器指定類型 ,那么在使用這個容器的時候,就不用特意的轉型了