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{}
由於,其中放置是從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{}
Apple a=(Apple) list.get(0);
小結
extends 可用於返回類型限定,不能用於參數類型限定。
super 可用於參數類型限定,不能用於返回類型限定。
帶有super超類型限定的通配符可以向泛型對象寫入,
帶有extends子類型限定的通配符可以向泛型對象讀取。