2009-08-19 89 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);