[英]How Type Erasure work in java?
我正在瀏覽http://download.oracle.com/javase/tutorial/java/generics/erasure.html上的TypeErasure主題,該主題表示編譯器會刪除與類或方法中的類型參數和類型參數有關的所有信息。
現在考慮下面的代碼
public class Box<T> {
private T t; // lineA, T stands for "Type"
public void add(T t) { // lineB
this.t = t; // lineC
}
public T get() { // lineD
return t; // lineE
}
}
現在在main
方法里面我有下面的代碼片段
Box<String> box1 = new Box<String>(); // line1
box1.add("Scott"); // line2
String s1tr=box1.get(); // line3
Box<Integer> box2 = new Box<Integer>(); // line4
box2.add(1); // line5
Integer k=box2.get(); // line6
現在在上面的代碼中(在Box
類和main
方法中),編譯器將進行哪些更改以及在哪一行?
正如鏈接所指出的那樣,編譯器將刪除與類或方法中的類型參數和類型參數有關的所有信息,當編譯器將編譯Box
類時,它將分別從Box
類和main
方法中刪除所有T
, <String>
, <Integer>
? 如果是,刪除T
之后的編譯代碼是什么?
類型擦除發生在編譯時。 Java編譯器從源中刪除那些泛型類型信息,並根據需要添加強制類型轉換並提供字節碼。 因此,生成的字節碼將不包含有關類型參數和參數的任何信息。 看起來像沒有泛型的舊Java代碼。 無法在運行時確定T的值,因為在編譯代碼之前會刪除該信息。
在沒有示例代碼那樣的類型限制的情況下,在Box類中(大致)會發生這種情況,方法代碼中對T
的所有引用的所有實例都將被Object 替換 。 在使用Box類的代碼中,所有<String>
, <Integer>
等實例都將被刪除 。
關於Java泛型的詳盡詳盡的文章是Angelika Langer的FAQ-還解釋了類型邊界的影響以及更多內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.