6 回答
TA貢獻1805條經驗 獲得超10個贊
擦除是指運行時在泛型類內部無法得到有關泛型參數的任何信息, 如果指定了邊界,泛型變量的實際類型就是邊界,樓主示例中的代碼沒有指定邊界, 所以擦出到Object, 也就是obj實際運行時的類型為Object, 之所以使用get()方法不需要強制類型轉換, 是因為編譯期在編譯時幫你生成了轉換的代碼, 如果我沒記錯的話, 大概處理之后的情況和示例2的main方法中的String s = (String)holder.get()類似, 詳細的樓主可以用javap 反編譯查看.
對于第二個問題, 我覺著這就和看不看源碼是一個道理, 不看也不影響編程, 但是看過之后明白了, 寫起來會很得心應手, 我還是學生, 實際編程的情況就不知道啦, 一點點看法~
TA貢獻1820條經驗 獲得超9個贊
TA貢獻1812條經驗 獲得超5個贊
擦除是在編譯期擦除,將 java 文件編譯為 class 文件時擦除。java 的泛型,可以看成一種語法糖,使得我們在書寫java代碼時更安全便捷。
擦除在實際工作中沒有用到,擦除可以認為是泛型語法糖在編譯期的一種解釋動作。
TA貢獻1833條經驗 獲得超4個贊
1.首先,擦除通俗的說是指泛型標簽是交給Javac編譯器去執行的,并起作用的。 代碼過完編譯期,運行期間就不管了《T》,在class文件找不到T了。 這里你顯示了指明了類型是<String>,那么編譯器會在編譯期間將GenericHolder中持有的T轉換成String類型。 所以你的get不用轉型了(編譯器已經把String識別出來了)。
2.擦除是泛型中很重要的概念,可以說不懂擦除就不懂泛型。實際工作中有常見有關聯的是對象的序列化反序列化,如gson等框架中會用到。
TA貢獻1845條經驗 獲得超8個贊
GenericHolder<String> 中的
private T obj;
public void set(T obj) { this.obj = obj; }
public T get() { return obj; }
相當于
private Object obj;
public void set(Object obj) { this.obj = obj; }
public Object get() { return (Object) obj; }
...
String s = (String) holder.get();
其實就是個語法糖
添加回答
舉報
