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

溫馨提示×

溫馨提示×

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

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

泛型在Java中的應用

發布時間:2020-06-18 17:22:31 來源:億速云 閱讀:197 作者:元一 欄目:編程語言

簡介

Java 泛型的參數只可以代表類,不能代表個別對象。由于 Java 泛型的類型參數之實際類型在編譯時會被消除,所以無法在運行時得知其類型參數的類型。Java 編譯器在編譯泛型時會自動加入類型轉換的編碼,故運行速度不會因為使用泛型而 加快。Java 允許對個別泛型的類型參數進行約束,包括以下兩種形式(假設 T 是泛型的類型參數,C 是一般類、泛類,或是泛型的類型參數):T 實現接口 I 。T 是 C ,或繼承自 C 。一個泛型類不能實現Throwable接口。

一. 模糊性錯誤

對泛型類 User< T, K > 而言,聲明了兩個泛型類參數:T 和 K。在類中試圖根據類型參數的不同重載 set() 方法。這看起來沒什么問題,可編譯器會報錯

public class User<T, K> {
    //重載錯誤
    public void set(T t) {
    }
    //重載錯誤
    public void set(K k) {
    }
}

首先,當聲明 User 對象時,T 和 K 實際上不需要一定是不同的類型,以下的兩種寫法都是正確的

public class GenericMain {
    public static void main(String[] args) {
        User<String, Integer> stringIntegerUser = new User<>();
        User<String, String> stringStringUser = new User<>();
    }
}

對于第二種情況,T 和 K 都將被 String 替換,這使得 set() 方法的兩個版本完全相同,所以會導致重載失敗。

此外,對 set() 方法的類型擦除會使兩個版本都變為如下形式:

一樣會導致重載失敗

public void set(Object o) {
}

二. 不能實例化類型參數

不能創建類型參數的實例。因為編譯器不知道創建哪種類型的對象,T 只是一個占位符

public class User<T> {
    private T t;
    public User() {
        //錯誤
        t = new T();
    }
}

三.對靜態成員的限制

靜態成員不能使用在類中聲明的類型參數,但是可以聲明靜態的泛型方法

public class User<T> {
    //錯誤
    private static T t;
    //錯誤
    public static T getT() {
        return t;
    }
    //正確
    public static <K> void test(K k) {
    }
}

四. 對泛型數組的限制

不能實例化元素類型為類型參數的數組,但是可以將數組指向類型兼容的數組的引用

public class User<T> {
    private T[] values;
    public User(T[] values) {
        //錯誤,不能實例化元素類型為類型參數的數組
        this.values = new T[5];
        //正確,可以將values 指向類型兼容的數組的引用
        this.values = values;
    }
}

此外,不能創建特定類型的泛型引用數組,但使用通配符的話可以創建指向泛型類型的引用的數組

public class User<T> {
    private T[] values;
    public User(T[] values) {
        this.values = values;
    }
}
public class GenericMain {
    public static void main(String[] args) {
        //錯誤,不能創建特定類型的泛型引用數組
        User<String>[] stringUsers = new User<>[10];
        //正確,使用通配符的話,可以創建指向泛型類型的引用的數組
        User<?>[] users = new User<?>[10];
    }
}

五. 對泛型異常的限制

泛型類不能擴展 Throwable,意味著不能創建泛型異常類

向AI問一下細節

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

AI

田东县| 贵阳市| 洛隆县| 辽中县| 大安市| 磐石市| 堆龙德庆县| 毕节市| 涡阳县| 蒙自县| 彭阳县| 永吉县| 汤阴县| 岑溪市| 琼结县| 庆阳市| 屏东市| 法库县| 栾城县| 阿荣旗| 新巴尔虎右旗| 监利县| 洛隆县| 湄潭县| 阳新县| 金湖县| 大城县| 鲁甸县| 崇阳县| 文成县| 西畴县| 绥中县| 永德县| 静乐县| 丹凤县| 临清市| 元朗区| 木兰县| 中方县| 望都县| 杭锦旗|