Java泛型?

3
多年来,我看到很多人使用“泛型”这个词,但说实话,我不知道它的意思。也许我在使用它,只是不知道它被称为“泛型”。 :p

这不仅是一个真正的问题,而且也是 https://dev59.com/xHRB5IYBdhLWcg3w26x3 和许多其他问题的真正重复。 - John Saunders
3个回答

23

http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html获取

泛型提供了一种方式,让你可以告诉编译器集合的类型,以便进行检查。一旦编译器知道了集合的元素类型,就可以检查你是否一致地使用了集合,并且可以在从集合中取出值时插入正确的转换。

这里是一个简单的例子,摘自现有的Collections教程:

    // Removes 4-letter words from c. Elements must be strings
    static void expurgate(Collection c) {
        for (Iterator i = c.iterator(); i.hasNext(); )
          if (((String) i.next()).length() == 4)
            i.remove();

}

这里是一个使用泛型修改后的相同示例:

    // Removes the 4-letter words from c
    static void expurgate(Collection<String> c) {
        for (Iterator<String> i = c.iterator(); i.hasNext(); )
          if (i.next().length() == 4)
            i.remove();

}

抱歉直接复制黏贴,但我发现这篇文章比我自己写的好。

编辑以包含评论中提出的一个好观点:

泛型不仅限于向编译器传递集合类型...集合库只是演示它们的好方法。


1
如果您能够给出完整详细的答案,并提供文档链接,我们将给您点个赞。 - Grant Wagner
2
我还建议阅读Effective Java(第二版)的泛型章节--可在http://java.sun.com/docs/books/effective/generics.pdf 上线阅读。如果你正在编写一个泛型类(而不仅仅是像示例中那样使用一个泛型类),这将特别有用。 - Kathy Van Stone
1
我认为值得注意的是,泛型不仅限于“向编译器传递集合类型”,而集合库只是展示它们的好方法之一。不幸的是,目前我只能想到FutureTask<V>这个例子。+1 - Grundlefleck
1
+1 对于一个很棒的用户名,不过答案也不错 :) - Lukas Eder

4
基本上,它归结为减少您需要投掷的次数。;-)
List<String> lst = new ArrayList<String>();
...
String first = lst.get(0);

对比

List lst = new ArrayList();
...
String first = (String) lst.get(0);

0

泛型只是Java对参数化多态性的实现。它们的工作方式与其他任何语言中的参数化多态性相同。


2
不完全正确。在Java中,泛型是通过类型擦除来实现的。换句话说,它们只是语法糖,并不会改变底层字节码。这与C++或C#中的泛型非常不同,因为参数化类型实际上是不同的类型。 - Barry Wark
我曾经想在最后一句话中加上“……只是更丑陋和更糟糕”,但我认为那可能有点不公平。然而,Java泛型是由Phil Wadler等人设计的,他还参与了Haskell的设计,后者可能拥有最全面的参数多态性实现。 - Jörg W Mittag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接