关于Java泛型和擦除
“編譯期間擦除泛型”是常識(好吧,類型參數和實參實際上就是被擦除的)。 這是由于“類型擦除”而發生的。 但這是錯誤的,正如許多開發人員所假設的那樣,刪除了<..>符號內指定的所有內容。 請參見下面的代碼:
你知道那是什么嗎?
類java.lang.String
類ClassTest $ Bar
類java.lang.String
類java.lang.StringBuilder
接口java.lang.CharSequence
您會看到每個類型的參數都會保留下來,并且可以在運行時通過反射進行訪問。 但是,什么是“類型擦除”? 必須刪除某些內容嗎? 是。 實際上,除結構化結構外,其他所有結構均與之相關–上面的所有內容都與類的結構有關,而不是與程序流程有關。 換句話說,有關類的類型參數及其字段和方法的元數據被保留以通過反射進行訪問。
但是,其余部分將被刪除。 例如,以下代碼:
List<String> list = new ArrayList<>(); Iterator<String> it = list.iterator(); while (it.hasNext()) {String s = it.next(); }實際上將被轉換為此(兩個片段的字節碼相同):
List list = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) {String s = (String) it.next(); }因此,將刪除您在方法主體中定義的所有類型參數,并在需要的地方添加強制類型轉換。 另外,如果定義了一個方法以接受List<T> ,則此T將被轉換為Object(或如果聲明了其邊界,則轉換為其界限。這就是為什么您不能執行new T() (順便說一句,有關此擦除的公開問題 )。
到目前為止,我們已經涵蓋了類型擦除定義的前兩點。 第三個是關于橋接方法。 我已經用這個stackoverflow問題(和答案)進行了說明 。
所有這兩個“道德”。 首先,java泛型很復雜。 但是您可以在不了解所有復雜性的情況下使用它們。
其次,不要假設所有類型信息都被刪除了–結構類型參數在那里,因此,如果需要,可以使用它們(但不要過分依賴反射)。
翻譯自: https://www.javacodegeeks.com/2014/11/on-java-generics-and-erasure.html
總結
以上是生活随笔為你收集整理的关于Java泛型和擦除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PrimeFaces 5.0 DataT
- 下一篇: 房东租房备案登记要交税吗(房东租房备案)