91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java泛型類型擦除的介紹

發布時間:2020-05-15 11:47:06 來源:億速云 閱讀:312 作者:Leah 欄目:編程語言

今天小編就為大家帶來一篇有關java泛型類型擦除的文章。小編覺得知識點挺豐富的,為此分享給大家做個參考。一起跟隨小編過來看看吧。

我們都知道泛型本質上是提供類型的"類型參數",它們也被稱為參數化類型(parameterized type)或參量多態(parametric polymorphism)。其實泛型思想并不是 Java 最先引入的,C++ 中的模板就是一個運用泛型的例子。

GJ(Generic Java)是對 Java 語言的一種擴展,是一種帶有參數化類型的 Java 語言。用 GJ 編寫的程序看起來和普通的 Java 程序基本相同,只不過多了一些參數化的類型同時少了一些類型轉換。實際上,這些 GJ 程序也是首先被轉化成一般的不帶泛型的 Java 程序后再進行處理的,編譯器自動完成了從 Generic Java 到普通 Java 的翻譯。

java泛型類型擦除的介紹

什么是真實的java泛型

我們都知道編譯器會進行泛型擦除,編譯器可以在對源程序(帶有泛型的 Java 代碼)進行編譯時使用泛型類型信息保證類型安全,對大量如果沒有泛型就不會去驗證的類型安全約束進行驗證,同時在生成的字節碼當中,將這些類型信息清除掉。下面我們先驗證一下:

public static void main(String[] args) {
 ArrayList<Integer> ints = new ArrayList<Integer>();
 ints.add(1); 
 ints.add(2);
 ints.add(3);
 ArrayList<String> sts = new ArrayList<String>();
 sts.add("a");
 sts.add("b");
 sts.add("c");
 System.out.println(ints.getClass() == sts.getClass()); 
}

上面打印的結果是true,原因是

按照理解,泛型擦除后將不能找回原來的類型,都是Object形式的,真的如此嗎?

看一下如下代碼:

import java.lang.reflect.ParameterizedType;import java.util.ArrayList;import java.util.List;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> {}
    }

打印出

class java.lang.Stringclass com.javapuzzle.davidwang456.ClassTest$Barclass java.lang.Stringinterface java.lang.CharSequence

你會發現每一個類型參數都被保留了,而且在運行期可以通過反射機制獲取到。那么到底什么是“類型擦除”?至少某些東西被擦除了吧?是的。事實上,除了結構化信息外的所有東西都被擦除了 —— 這里結構化信息是指與類結構相關的信息,而不是與程序執行流程有關的。換言之,與類及其字段和方法的類型參數相關的元數據都會被保留下來,可以通過反射獲取到。

看完上述內容,你們對java泛型類型大概了解了嗎?如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南靖县| 四子王旗| 米易县| 兴义市| 禹州市| 荥阳市| 象州县| 吉安市| 昆山市| 任丘市| 龙州县| 乌拉特前旗| 抚顺县| 彝良县| 大连市| 色达县| 北宁市| 陕西省| 平遥县| 固始县| 石棉县| 通州区| 固阳县| 九江县| 兴宁市| 仁布县| 黄大仙区| 拜泉县| 天长市| 莱西市| 兴山县| 麻城市| 烟台市| 南皮县| 凯里市| 乐昌市| 上犹县| 西盟| 开封市| 榆树市| 丰都县|