java泛型 wildcard

 
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

相关文章
相关标签/搜索