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

相關文章
相關標籤/搜索