2012-01-18 89 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

相关问题