Java學習升階 -01-一篇看懂java泛型(2)

泛型的補充理解:泛型將參數做爲變量能夠更靈活高效的複用功能相同的業務代碼,泛型能夠用Object的引用來實現參數"任意化",「任意化」帶來的缺點是要作顯式的強制類型轉換,而這種轉換是要求開發者對實際參數類型能夠預知的狀況下進行的。對於強制類型轉換錯誤的狀況,編譯器可能不提示錯誤,在運行的時候纔出現異常,這是自己就是一個安全隱患。
那麼泛型的好處就是在編譯的時候可以檢查類型安全,而且全部的強制轉換都是自動和隱式的。安全

特別強調理解關於泛型通配符?,?表明一個佔位符號,代表未來使用時候再指明類型。

這裏看兩個栗子:
一、定義打印一個集合元素ide

public static void print(List<?> list){
        list.add("test");  //報錯,這裏對將來使用對類型是沒法肯定對
        for (Object o: list
             ) {
            System.out.println(o);
        }
    }

二、父類 Animal 和幾個子類,如狗、貓等code

static int countLegs (List<? extends Animal > animals ) {
    int retVal = 0;
    for ( Animal animal : animals )
    {
        retVal += animal.countLegs();
    }
    return retVal;
}

static int countLegs1 (List< Animal > animals ){
    int retVal = 0;
    for ( Animal animal : animals )
    {
        retVal += animal.countLegs();
    }
    return retVal;
}

public static void main(String[] args) {
    List<Dog> dogs = new ArrayList<>();
     // 不會報錯
    countLegs( dogs );
    // 報錯
    countLegs1(dogs);
}

因此,對於不肯定或者不關心實際要操做的類型,可使用無限制通配符(尖括號裏一個問號,即 ),表示能夠持有任何類型。像 countLegs 方法中,限定了上屆,可是不關心具體類型是什麼,因此對於傳入的 Animal 的全部子類均可以支持,而且不會報錯。而 countLegs1 就不行。開發

相關文章
相關標籤/搜索