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