import java.util.ArrayList; import java.util.List; public class WildCard { public static void main(String[] args) { Item<Dog> item = new Item<Dog>(new Dog()); item.get(); Item<? extends Pet> item2 = new Item<Dog>(new Dog()); item2.get().out(); /**知道某種限制,可是不知道具體是什麼**/ List<? extends Pet> list = new ArrayList<Dog>(); /** * The method add(capture#2-of ? extends Pet) in the type List<capture#2-of ? extends Pet> * is not applicable for the arguments (Dog) * list.add(new Dog()); * 從錯誤代碼得知,編譯期list的類型是List<? extends Pet>,因此通配符仍是個未知類型; * 只知道是某種Pet的子類,可是並不知道具體的子類是什麼,沒法確保類型兼容; * 即便list.add(new Object()); (Object類型與Pet的子類不兼容) 也是不能夠的; * list.add(null);這個能夠;因此對於使用通配符的泛型,只能「取」不能「加」; * 編譯器只容許加null;由於只有 Pet的子類 = null;等式成立; */ //list.get(0); List<? super Dog> list2 = new ArrayList<Dog>(); /** * 這關係到泛型的邊界(bounds),list通配符使用的是上邊界,沒法肯定具體的類; * 這裏list2用的是下邊界,取放的是Dog某種超類,可是並不知道具體的超類是什麼; * 咱們只知道Dog的子類能夠跟Dog超類類型兼容 * 因此這種形式的通配符只能「存」不能「取」 */ list2.add(new Dog()); /** * list2.add(new Object()); */ list2.add(new PettyDog()); /**ClassCastException**/ //list2.add((Dog) new Run()); } } interface Pet { public void out(); } class Item<T extends Pet> { T item; public Item(T item) { this.item = item; } public T get() { return item; } public void put(T item) { } } class Run {} class Dog extends Run implements Pet { @Override public void out() { System.out.println("The Dog!"); } public void getMsg(Item<?> item) { item.get(); /** *The method put(capture#3-of ?) in the type Item<capture#3-of ?> * is not applicable for the arguments (Item<capture#4-of ?>) * capture:佔位符被稱爲這個特殊通配符的捕獲 * item.put(item); */ } } class PettyDog extends Dog { }
推薦閱讀:http://www.ibm.com/developerworks/cn/java/j-jtp04298.html html