2012-01-18 153 views
1

我以前沒有使用泛型,我想知道什麼時候應該使用它們以及它的優點是什麼。我認爲它可能適用於我創建的集合,因爲java總是使用泛型進行集合,但如果我調用創建的方法,則已經在該函數中設置了該類型,因此無論如何它都會給出錯誤。我應該什麼時候使用泛型類?你能舉一個例子,因爲我不知道如何使用它。目前我的代碼如下:什麼時候創建泛型類

public class NodeList { 
    private static final int MAX_AMOUNT_OF_NODES = 12; 
    private HashMap<String, Node> nodeList; 

    public NodeList(){ 
    nodeList = new HashMap<String, Node>(MAX_AMOUNT_OF_NODES); 
    } 

    public Node get(String id){ 
    return nodeList.get(id); 
    } 

    public boolean add(Node node){ 
    if(nodeList.size() <= MAX_AMOUNT_OF_NODES){ 
     nodeList.put(node.id, node); 
     return true; 
    } 
    return false; 
    } 
} 

回答

2

您可以查看現有的API以獲得指導。例如,所有的集合都是通用的。這是因爲所有集合都包含一個類型的元素。

從這個角度講,當你不得不一次又一次地爲不同類型創建完全相同的代碼時,應該使用泛型類。如果你必須這樣做,泛型可能會爲你提供一些好處。

舉一個例子,docs are a good place to start

從該鏈接,第一個代碼示例是

public class Box<T> { 

    // T stands for "Type" 
    private T t; 

    public void add(T t) { 
     this.t = t; 
    } 

    public T get() { 
     return t; 
    } 
} 

概念上,即是要包含的東西Box類。它包含的內容並不重要,因爲類型是程序員特有的。 Box實例基本上可以包含任何東西。當程序員需要創建一個框時,他/她指定類型。

Box<SomeClass> myBox = new Box<SomeClass>();

想想這種方式 - 如果你想創建一個能裝東西沒有仿製藥的通用盒,你必須

1)有場fObject ,或者
2)爲每個盒子可能包含的類型創建一個Box類。

使用泛型,您只需要一個類,並且您可以指定確切的類型。也許如果你正在做一些事情,並且你的方法涉及上面的1或2,那麼最好使用泛型。

1

如果Node是一類可容納一塊與某些類型的數據(如String,例如),那麼你應該泛型化Node並隨後NodeList以防止類型錯誤。

如果您不這樣做,那麼您將它留給您的NodeList的用戶,以確保當列表只應保存String s時,她絕不會添加Integer。泛型主要是關於在編譯時間而不是運行時上捕獲類型問題。

這是很簡單的話,改變這樣的事情:

public class Node { 
    Object data; 
    //... 
} 

到這樣的事情:

public class Node<T> { 
    T data; 
    //... 
} 

public class NodeList<T> { 
    public Node<T> get(String id) { 
     //... 
    } 

    public boolean add(Node<T> node) { 
     //... 
    } 
} 

NodeList看起來像它可能具有的第二個類型參數鍵類型,它現在限制爲String

0

您可以一般地鍵入方法參數以及類本身。下面是從Java的java.util.List的接口的例子:

public interface List<E> { 

//... 

    boolean add(E e); 

//... 

} 
0

泛型是爲Java強制收集數據結構(在你的情況的HashMap)只接受特定類型的對象的方式。這意味着,在編譯的時候,如果你想是這樣:

nodeList.add(1, new Node()); 

它會失敗,而不是因爲編譯1不是一個String對象。這通常是一種編寫更整潔的代碼的方法。

檢查此鏈接以及:http://en.wikipedia.org/wiki/Generics_in_Java