List 和 Set

Java 泛型

關鍵字說明

  • ? 通配符類型
  • <? extends T> 表示類型的上界,表示參數化類型的可能是T 或是 T的子類
  • <? super T> 表示類型下界(Java Core中叫超類型限定),表示參數化類型是此類型的超類型(父類型),直至Object

extends 示例

 class Food {
    public static void main(String[] args) {
        //List<? extends T>
        List<? extends Fruit> list=new ArrayList<Apple>();
//        list.add(new Apple());
//        list.add(new Object());
        list.add(null);

        Fruit f=list.get(0);
        Apple a=(Apple) list.get(0);
    }
}

class Fruit extends Food{}
class Apple extends Fruit{}

List<? extends Frut> 表示 “具有任何從Fruit繼承類型的列表”,編譯器無法確定List所持有的類型,所以無法安全的向其中添加對象。可以添加null,因爲null 可以表示任何類型。所以List 的add 方法不能添加任何有意義的元素,但是可以接受現有的子類型List<Apple> 賦值。


由於,其中放置是從Fruit中繼承的類型,所以可以安全地取出Fruit類型。

list.contains(new Apple());
 list.contains(new Fruit());

在使用Collection中的contains 方法時,接受Object 參數類型,可以不涉及任何通配符,編譯器也允許這麼調用。

super 示例

 class Food {
    public static void main(String[] args) {
        List<? super Fruit> list=new ArrayList<Fruit>();
        list.add(new Apple());
        list.add(new Fruit());
    }
}

class Fruit extends Food{}
class Apple extends Fruit{}


List<? super Fruit> 表示“具有任何Fruit超類型的列表”,列表的類型至少是一個 Fruit 類型,因此可以安全的向其中添加Fruit 及其子類型。

Apple a=(Apple) list.get(0);

小結

extends 可用於返回類型限定,不能用於參數類型限定。
super 可用於參數類型限定,不能用於返回類型限定。
帶有super超類型限定的通配符可以向泛型對象寫入,
帶有extends子類型限定的通配符可以向泛型對象讀取。


發佈了39 篇原創文章 · 獲贊 35 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章