標籤:
1 package thinkingInJava; 2 /* 3 * 類比擦除 4 */ 5 public class SimpleHolder { 6 7 private Object obj ; 8 public void set(Object o ){ 9 obj = o ;10 }11 public Object get(){12 return obj ;13 }14 public static void main(String[] args) {15 // 如果該類使用了泛型參數,並且這個obj變數類型就是這個泛型參數表示的類型,那麼當構造這個類的對象的時候會自動擦除類型資訊,16 // 對於有非泛型上界的變數類型轉換成對應的非泛型上界,沒有指定的則轉換成Object17 SimpleHolder demo = new SimpleHolder() ;18 // 在運行時編譯器丟到了所有的類型資訊,所以set方法參數即使使用了泛型也不會起作用,19 // 而是將其轉換成器非泛型上界,但是在對象進入時(通過泛型設定值)會判斷這個對象與泛型的一致性20 demo.set("xxx") ;21 // 當然擷取時也是擷取的對應非泛型上界類型的值。但是編譯器會自動插入強制類型轉換的代碼22 String x = (String) demo.get() ;23 }24 }
package thinkingInJava;/* * 使用泛型版本 */public class GenericHolder<T> {private T obj ;public void set(T t ){this.obj = t ;}public T get(){return obj ;}public static void main(String[] args) {GenericHolder<String> demo = new GenericHolder<String>() ;//demo.set(new Object()); 雖然在運行時丟到了所有的類型資訊,但是編譯器仍然會保證傳遞進去的參數與泛型一致demo.set("hello ") ;String x = demo.get() ; // 出來時編譯器自動插入強制類型轉碼}}
關於Java擦除特性