[英]java Generic<T> same as Generic?
根據Java中的類型擦除的理論,我認為以下兩個代碼段應編譯為相同的Java類,從而具有相同的字節碼。
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不錯的提示,謝謝。
但是我無法在短時間內獲得對字節碼的詳細了解。
我想知道泛型是否使用T擦除編譯到對象。
此處的類中的方法確實具有相同的字節碼 ,但是字節碼並不是類文件中唯一的內容。
類文件還包含類及其成員的聲明,包括類的超類和實現接口,其方法的參數和返回類型,其字段的類型等。所有這些聲明都保留泛型(以便編譯類以后可以單獨針對此類進行檢查)。 因此,類文件是不同的。
類型擦除 (不是類型擦除)並不意味着您的兩個示例將具有相同的字節碼,這基本上意味着,如果您可以手動對非通用遺留類型進行類型轉換,或者編譯器將對參數化類型為您進行類型轉換(否運行時開銷)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.