引自:http://sharewind.iteye.com/blog/1622164 關鍵字說明
- ? 萬用字元類型
- <? extends T> 表示類型的上界,表示參數化型別的可能是T 或是 T的子類
- <? super T> 表示類型下界(Java Core中叫超類型限定),表示參數化型別是此類型的超類型(父類型),直至Object
extends 樣本static class Food{}static class Fruit extends Food{}static class Apple extends Fruit{}static class RedApple extends Apple{}List<? extends Fruit> flist = new ArrayList<Apple>();// complie error:// flist.add(new Apple());// flist.add(new Fruit());// flist.add(new Object());flist.add(null); // only work for null
List<? extends Frut> 表示 “具有任何從Fruit繼承類型的列表”,編譯器無法確定List所持有的類型,所以無法安全的向其中添加對象。可以添加null,因為null 可以表示任何類型。所以List 的add 方法不能添加任何有意義的元素,但是可以接受現有的子類型List<Apple> 賦值。 Fruit fruit = flist.get(0);Apple apple = (Apple)flist.get(0);
由於,其中放置是從Fruit中繼承的類型,所以可以安全地取出Fruit類型。 flist.contains(new Fruit());flist.contains(new Apple());
在使用Collection中的contains 方法時,接受Object 參數類型,可以不涉及任何萬用字元,編譯器也允許這麼調用。 super 樣本List<? super Fruit> flist = new ArrayList<Fruit>();flist.add(new Fruit());flist.add(new Apple());flist.add(new RedApple());// compile error:List<? super Fruit> flist = new ArrayList<Apple>();
List<? super Fruit> 表示“具有任何Fruit超類型的列表”,列表的類型至少是一個 Fruit 類型,因此可以安全的向其中添加Fruit 及其子類型。由於List<? super Fruit>中的類型可能是任何Fruit 的超類型,無法賦值為Fruit的子類型Apple的List<Apple>. // compile error:Fruit item = flist.get(0);
因為,List<? super Fruit>中的類型可能是任何Fruit 的超類型,所以編譯器無法確定get返回的物件類型是Fruit,還是Fruit的父類Food 或 Object. 小結extends 可用於的傳回型別限定,不能用於參數類型限定。super 可用於參數類型限定,不能用於傳回型別限定。>帶有super超類型限定的萬用字元可以向泛型對易用寫入,帶有extends子類型限定的萬用字元可以向泛型對象讀取。
|