2016-08-16 42 views
0

根據java中的類型擦除理論,我認爲以下兩個代碼段應該編譯爲相同的java類,因此具有相同的字節碼。java通用<T>與Generic相同嗎?

public class Generic { 
    private Object t; 

    public void hi() { 
     System.out.println(t); 
    } 
} 

的javac Generic.java

MV Generic.class Generic1.class

public class Generic<T> { 
    private T t; 

    public void hi() { 
     System.out.println(t); 
    } 
} 

的javac Generic.java

MV Generic.class Generic2.class

比較Generic1.class和Generic2.class,它們是完全不同的。

那麼我的想法有什麼問題?以及通用如何編譯爲字節碼?


[編輯]

javap的-v好的尖端,謝謝。

但在短時間內我無法獲得與字節碼的細節理解。

我想知道通用編譯與刪除對象。

+0

@ElliottFrisch我沒有看到你提到的額外的演員 - '比較輸出只給常量(那是什麼事情開始哈希,是吧?)。不錯的提示'javap -v'雖然! – Alec

回答

1

這裏的類中的方法確實有相同的字節碼,但字節碼不是類文件中唯一的東西。

類文件還包含類及其成員的聲明,包括類的超類和實現接口,其方法的參數和返回類型,字段的類型等。所有這些聲明都保留泛型以便稍後可以檢查與這個類分開編譯的類)。所以類文件是不同的。

0

類型擦除(不鍵入擦除)並不意味着你的兩個例子具有相同的字節碼,這意味着基本上是如果你能做到型手動蒙上了非通用傳統類型或編譯器會做爲您提供參數化類型(無運行時間開銷)。

+0

實際上,它*確實意味着類將具有相同的字節碼。但是,如果類型「T」返回給它們,則使用該類的代碼可能不具有相同的字節碼;但在這種情況下,由於'T'類型從不出現在公共接口中。 – newacct