2009-08-19 87 views
3

多年来,我看到很多人使用“泛型”这个词,我真的不知道它的意思,不管它是我最有可能使用它,但只是不知道它被称为。 :PJava泛型?

+0

不仅是一个真正的问题,但http://stackoverflow.com/questions/490091/java-generics和其他许多人的真实副本。 – 2009-08-20 00:33:54

回答

23

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

泛型为您提供了一个集合的类型传达给编译器,它可以检查的方式。一旦编译器知道了集合的元素类型,编译器就可以检查你是否一直使用这个集合,并且可以将正确的强制类型转换为从集合中取出的值。

这里是从现有的类别教程截取的简单的例子:

// 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

+1以获得与文档链接的完整全面的答案。 – 2009-08-19 18:40:45

+2

我还建议阅读Effective Java(第二版)的泛型章节 - 可以在http://java.sun.com/docs/books/effective/generics.pdf上在线获得。如果您正在编写泛型类(而不是像示例中那样只使用泛型类),这将特别有用。 – 2009-08-19 18:50:13

+0

@Kathy,+1好链接 – 2009-08-19 18:53:28

0

泛型只是Java的参数化多态性的实现。它们的工作方式与其他语言中的Parametric Polymorphism类似。

+2

不完全。在Java中,泛型是通过类型擦除来实现的。换句话说,它们只是syntally sugar,根本不会改变底层的字节码。这与例如C++或C#中的泛型非常不同,其中参数化类型实际上是不同的类型。 – 2009-08-19 20:34:10

+0

我试图添加“...只是更糟和更糟“,但我认为这样做并不公平,但Java泛型是由Phil Wadler等人设计的,他也参与了Haskell的设计,该设计可能具有最全面的实现参数多态性。 – 2009-08-19 20:37:57

4

它基本上归结为你必须减少的次数。 ;-)

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

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