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

溫馨提示×

溫馨提示×

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

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

《Java架構筑基》從Java基礎講起——泛型擦除

發布時間:2020-07-27 18:07:21 來源:網絡 閱讀:125 作者:未來可期_ 欄目:編程語言

一. 什么是泛型擦除

就是指編譯器編譯帶類型說明的集合時會去掉“類型”信息

二. 泛型擦除案例

泛型是提供給javac編譯器使用的,限定集合的輸入類型,編譯器編譯帶類型說明的集合時會去掉“類型”信息。

public class GenericTest {
    public static void main(String[] args) {
        new GenericTest().testType();
    }

    public void testType(){
        ArrayList<Integer> collection1 = new ArrayList<Integer>();
        ArrayList<String> collection2= new ArrayList<String>();

        System.out.println(collection1.getClass()==collection2.getClass());
        //兩者class類型一樣,即字節碼一致

        System.out.println(collection2.getClass().getName());
        //class均為java.util.ArrayList,并無實際類型參數信息
    }
}

輸出

true
java.util.ArrayList

為何會返回true

  • 這是因為不管為泛型的類型形參傳入哪一種類型實參,對于Java來說,它們依然被當成同一類處理,在內存中也只占用一塊內存空間。從Java泛型這一概念提出的目的來看,其只是作用于代碼編譯階段,在編譯過程中,對于正確檢驗泛型結果后,會將泛型的相關信息擦出,也就是說,成功編譯過后的class文件中是不包含任何泛型信息的。泛型信息不會進入到運行時階段。
  • 在靜態方法、靜態初始化塊或者靜態變量的聲明和初始化中不允許使用類型形參。由于系統中并不會真正生成泛型類,所以instanceof運算符后不能使用泛型類。

使用反射可跳過編譯器,往某個泛型集合加入其它類型數據。

  • 只有引用類型才能作為泛型方法的實際參數
  • 例子:
public class GenericTest {
    public static void main(String[] args) {
        swap(new String[]{"111","222"},0,1);//編譯通過

        //swap(new int[]{1,2},0,1);
        //編譯不通過,因為int不是引用類型

        swap(new Integer[]{1,2},0,1);//編譯通過
    }

    /*交換數組a 的第i個和第j個元素*/
    public static <T> void swap(T[]a,int i,int j){
        T temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

但注意基本類型有時可以作為實參,因為有自動裝箱和拆箱。

  • 例子(編譯通過了):
public class GenericTest {
    public static void main(String[] args) {
        new GenericTest().testType();
        int a = biggerOne(3,5);
        //int 和 double,取交為Number
        Number b = biggerOne(3,5.5);
        //String和int 取交為Object
        Object c = biggerOne("1",2);
    }
    //從x,y中返回y
    public static <T> T biggerOne(T x,T y){
        return y;
    }
}
  • 同時,該例還表明,當實參不一致時,T取交集,即第一個共同的父類。
  • 另外,如果用Number b = biggerOne(3,5.5);改為String c = biggerOne(3,5.5);則編譯報錯:
Error:(17, 29) java: 不兼容的類型: 推斷類型不符合上限
    推斷: java.lang.Number&java.lang.Comparable<? extends java.lang.Number&java.lang.Comparable<?>>
    上限: java.lang.String,java.lang.Object
向AI問一下細節

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

AI

河东区| 广水市| 黄浦区| 保定市| 拜城县| 诸暨市| 尚志市| 平顺县| 邢台市| 呼伦贝尔市| 大石桥市| 兴城市| 集贤县| 杭锦旗| 安庆市| 和政县| 日喀则市| 青州市| 县级市| 商水县| 澄江县| 汝南县| 顺昌县| 定日县| 城市| 连山| 马边| 和田市| 施秉县| 夏邑县| 定陶县| 温州市| 平泉县| 巩留县| 天全县| 孟州市| 荆州市| 高雄县| 白城市| 武乡县| 恩平市|