Java 5.0中最大的特性是引入了泛型,而引入泛型影響最大的就是幾個集合類。前一次我簡要記錄了一下學習List的筆記,本次我將概要地描述一下泛型在集合中的其他應用。
1.指定一個類型參數 一個類型參數主要針對List、Set等集合類而言,具體處理和List大同小異,不再贅述。
2.指定兩個類型參數
兩個類型參數主要針對Map集合類。Map類會存儲一對元素:鍵-值對,自然就會對應著兩種類型。通List一樣,使用Map時只需要指定參數類型就可以了,不同之處在于需同時指定鍵類型和值類型: ??????? Map<String, String> map = new HashMap<String, String>(); 如果理解了泛型的核心概念:所謂參數類型,不過是占位符而已;那么使用一個類型參數還是兩個類型參數其實沒有任何差別。 3.使用Iterator 如果集合類使用了類型參數,則定義相應的迭代器時也必須指定類型參數,例如: ??????? Map<Integer, String> map = new TreeMap<Integer, String>(); ????????Interator iter = map.keySet().iterator(); 上面的語句就是無法編譯的,因為Iterator和Map不配套;不過,反過來,如果集合類沒有使用類型參數,而Iterator使用了類型參數,這種情況是允許的,之所以這樣,主要是為了方便,省掉獲取元素必須進行映射的步驟。例如下面的語句: ??????? Map map = new TreeMap(); ????????Interator<Integer> iter = map.keySet().iterator(); 則是合法的,不過建議你別這么做,否則你是自找麻煩。因為對于下面的語句:
Map?map?
=
?
new
?HashMap();
????????map.put(
"
zero
"
,?
"
class?1
"
);
????????map.put(
1
,?
"
class?2
"
);
????????map.put(
"
two
"
,?
"
class?3
"
);
????????map.put(
"
three
"
,?
"
class?4
"
);
????????map.put(
"
four
"
,?
3
);
????????
????????Iterator
<
String
>
?iter?
=
?map.keySet().iterator();????
 ????????
while
(iter.hasNext())?
{
????????????System.out.println(iter.next());
????????}
你能期望得到什么?上面的語句編譯時不會出錯,不過運行時可能讓你大吃一驚。所以為了減少運行時出錯的可能,建議你盡量使用參數化類型。 4.函數形參參數類型化 我們也可以指定函數形參的參數類型,例如:
private
?
void
?printListOfStrings(List
<
String
>
?list,?PrintStream?out)?
throws
?IOException?
{
 ???????
for
?(Iterator
<
String
>
?i?
=
?list.iterator(?);?i.hasNext(?);?)?
{
???????out.println(i.next(?));
???????}
?????}
5.返回值參數類型化
除了可以使用集合體時采用參數化類型,返回值也可以采用參數類型化,例如:
private
?List
<
String
>
?getListOfStrings(?)?
{
????????List
<
String
>
?list?
=
?
new
?LinkedList
<
String
>
();
????????list.add(
"
Hello
"
);
????????
return
?list;
??????}
總之,引入泛型的目的就是為了減少編程時的錯誤,盡量將錯誤在編譯時就發現,而不是遺留到運行時,所以我們應該盡可能地運用好泛型這一強大的工具提高我們的編程能力。下面以一個很粗糙的例子作為本文的終結:
package
?com.jiang.tiger.chap1;

import
?java.util.ArrayList;
import
?java.util.Collection;
import
?java.util.Iterator;
import
?java.util.List;
import
?java.util.Map;
import
?java.util.HashMap;
import
?java.util.Set;
import
?java.util.TreeMap;


public
?
class
?IteratorTester?
{
 ????
public
?
static
?Map?MapInitial(Class?type)?
{
????????Map
<
Integer,?String
>
?map?
=
?
null
;
 ????????
try
?
{
????????????map?
=
?(Map
<
Integer,?String
>
)?type.newInstance();
????????????map.put(
0
,?
"
class?1
"
);
????????????map.put(
1
,?
"
class?2
"
);
????????????map.put(
2
,?
"
class?3
"
);
????????????map.put(
3
,?
"
class?4
"
);
????????????map.put(
4
,?
"
calss?4
"
);
 ????????}
?
catch
?(InstantiationException?e)?
{
????????????
//
?TODO?自動生成?catch?塊
????????????e.printStackTrace();
 ????????}
?
catch
?(IllegalAccessException?e)?
{
????????????
//
?TODO?自動生成?catch?塊
????????????e.printStackTrace();
????????}
????????
return
?map;
????}
????
 ????
public
?
static
?
void
?CollectionIterator()?
{
????????Map
<
Integer,?String
>
?map?
=
?MapInitial((
new
?HashMap
<
Integer,?String
>
()).getClass());
????????Collection
<
String
>
?list?
=
?map.values();
????????Iterator
<
String
>
?iter?
=
?list.iterator();
????????
 ????????
while
(iter.hasNext())?
{
????????????System.out.println(iter.next());
????????}
?????}
????
 ????
public
?
static
?
void
?ListIterator()?
{
????????Map
<
Integer,?String
>
?map?
=
?MapInitial((
new
?TreeMap
<
Integer,?String
>
()).getClass());
????????List
<
String
>
?list?
=
?
new
?ArrayList
<
String
>
();
????????Set
<
Integer
>
?set?
=
?map.keySet();
????????Iterator
<
Integer
>
?iter?
=
?set.iterator();
????????
 ????????
while
(iter.hasNext())?
{
????????????list.add(map.get(iter.next()));
????????}
????????
????????Iterator
<
String
>
?iterator?
=
?list.iterator();
 ????????
while
(iterator.hasNext())?
{
????????????System.out.println(iterator.next());
????????}
????}
????
 ????
public
?
static
?
void
?main(String[]?args)
{
????????CollectionIterator();
????????ListIterator();
????}
}
上面程序的運行結果如下所示:
class?
3
calss?
4
class?
2
class?
4
class?
1
class?
1
class?
2
class?
3
class?
4
calss?
4
|