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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

关于Java泛型和擦除

發(fā)布時(shí)間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Java泛型和擦除 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

您會(huì)看到每個(gè)類型的參數(shù)都會(huì)保留下來,并且可以在運(yùn)行時(shí)通過反射進(jìn)行訪問。 但是,什么是“類型擦除”? 必須刪除某些內(nèi)容嗎? 是。 實(shí)際上,除結(jié)構(gòu)化結(jié)構(gòu)外,其他所有結(jié)構(gòu)均與之相關(guān)–上面的所有內(nèi)容都與類的結(jié)構(gòu)有關(guān),而不是與程序流程有關(guān)。 換句話說,有關(guān)類的類型參數(shù)及其字段和方法的元數(shù)據(jù)被保留以通過反射進(jìn)行訪問。

但是,其余部分將被刪除。 例如,以下代碼:

List<String> list = new ArrayList<>(); Iterator<String> it = list.iterator(); while (it.hasNext()) {String s = it.next(); }

實(shí)際上將被轉(zhuǎn)換為此(兩個(gè)片段的字節(jié)碼相同):

List list = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) {String s = (String) it.next(); }

因此,將刪除您在方法主體中定義的所有類型參數(shù),并在需要的地方添加強(qiáng)制類型轉(zhuǎn)換。 另外,如果定義了一個(gè)方法以接受List<T> ,則此T將被轉(zhuǎn)換為Object(或如果聲明了其邊界,則轉(zhuǎn)換為其界限。這就是為什么您不能執(zhí)行new T() (順便說一句,有關(guān)此擦除的公開問題 )。

到目前為止,我們已經(jīng)涵蓋了類型擦除定義的前兩點(diǎn)。 第三個(gè)是關(guān)于橋接方法。 我已經(jīng)用這個(gè)stackoverflow問題(和答案)進(jìn)行了說明 。

所有這兩個(gè)“道德”。 首先,java泛型很復(fù)雜。 但是您可以在不了解所有復(fù)雜性的情況下使用它們。

其次,不要假設(shè)所有類型信息都被刪除了–結(jié)構(gòu)類型參數(shù)在那里,因此,如果需要,可以使用它們(但不要過分依賴反射)。

翻譯自: https://www.javacodegeeks.com/2014/11/on-java-generics-and-erasure.html

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。