2013-10-31 27 views
-4

我對Java中的泛型編程有疑問。Java威脅泛型編程如何?

當C++編譯器在代碼內部找到對泛型函數/對象(模板)的引用時,它會使用非泛型(具體)類型(適用於任何類型)創建函數。

我不知道它在Java中如何工作。 javac的行爲與C++編譯器相同嗎?或者它在運行時由JVM管理?

謝謝

+3

Java有類型擦除。 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – Cruncher

+0

Java使用它可以安全使用的最一般的具體類型。它通常是Object,除非某種要求被放在可以使用的類型上 – Cruncher

回答

3

泛型Java是一個純粹的編譯時間結構,以確保類型安全 - 它們是由編譯器刪除,取而代之的是原當量(但保證安全的,除非你明確鑄造到void說類型安全。)

這是一種相對簡單的實現泛型的方法,因爲不需要對虛擬機或熱點進行任何修改 - 僅僅是編譯器。除了在運行時沒有通用類型信息這一顯而易見的限制之外,它偶爾會造成「通用」實例也有意義的限制。舉例來說,如果我想要做的事,如:

public class CompareMe implements Comparator<Thing>, Comparator<OtherThing> { 

    public int compareTo(Thing other) { 
     //Blah 
    } 

    public int compareTo(OtherThing other) { 
     //Blah 
    } 
} 

......那麼這是不可能的使用形式,因爲直接仿製免費等同是:

public class CompareMe implements Comparator, Comparator { 

    public int compareTo(Object other) { 
     //Blah 
    } 

    public int compareTo(Object other) { 
     //Blah 
    } 
} 

...並明確在那裏與名字衝突有一個問題!當然,這可以使用單個比較器重寫,也可以使用帶有自定義比較器的compareTo方法,但值得注意。

0

Java在編譯之前爲轉換類型生成代碼。另外java使用type inference獲得正確的類型。例如:

List <Integer> mylist = new ArrayList<Integer>(); 
i.add(someInt); 

在舊風格,你可以手動conversuin類型:

Integer valI = (Integer)mylist.get(index); 

今天的編譯器「知道」的mylist類型元素,並通過自身添加(Integer)。結果你只寫它:

Integer valI = mylist.get(index);