日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 泛型和类型擦除_关于Java泛型和擦除

發布時間:2023/12/3 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 泛型和类型擦除_关于Java泛型和擦除 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java 泛型和類型擦除

“編譯期間擦除泛型”是常識(好吧,類型參數和實參實際上是被擦除的)。 這是由于“類型擦除”而發生的。 但這是錯誤的,正如許多開發人員所假設的那樣,將<..>符號內指定的所有內容都刪除了。 請參見下面的代碼:

public class ClassTest {public static void main(String[] args) throws Exception {ParameterizedType type = (ParameterizedType) Bar.class.getGenericSuperclass();System.out.println(type.getActualTypeArguments()[0]);ParameterizedType fieldType = (ParameterizedType) Foo.class.getField("children").getGenericType();System.out.println(fieldType.getActualTypeArguments()[0]);ParameterizedType paramType = (ParameterizedType) Foo.class.getMethod("foo", List.class).getGenericParameterTypes()[0];System.out.println(paramType.getActualTypeArguments()[0]);System.out.println(Foo.class.getTypeParameters()[0].getBounds()[0]);}class Foo<E extends CharSequence> {public List<Bar> children = new ArrayList<Bar>();public List<StringBuilder> foo(List<String> foo) {return null; }public void bar(List<? extends String> param) {}}class Bar extends Foo<String> {} }

你知道那是什么嗎?

類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 泛型和類型擦除

總結

以上是生活随笔為你收集整理的java 泛型和类型擦除_关于Java泛型和擦除的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。