java泛型学习2:解惑通配符

java泛型学习二:解惑通配符
package generic;

import java.awt.Canvas;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class Wildcard {
	// 打印集合c中所有的元素
	public static void printCollection(Collection c) {
		Iterator i = c.iterator();
		for (int k = 0; k < c.size(); k++) {
			System.out.print(i.next());
		}
	}

	public static void printCollectionWithGeric(Collection<Object> c) {
		for (Object e : c) {
			System.out.print(e);
		}
	}

	public static void printCollectionWithWildGeric(Collection<?> c) {
		for (Object e : c) {
			System.out.print(e);
		}
	}

	public static void main(String args[]) {
		/*
		 * 一、method(Collection c)与method(Collection<Object> c)的区别
		 * method(Collection c):调用参数据可以为Collection的子类,且对Collection中元素的类型没有限制。
		 * method(Collection<Object>
		 * c):调用参数可以为Collection的子类,但Collection中元素的必须为Object类型,不能是Object类型的子类型。
		 */
		List l = new ArrayList();
		l.add("aa");
		l.add("bb");
		Wildcard.printCollection(l);// result:aabb
		Wildcard.printCollectionWithGeric(l);// result:aabb
		// 1、参数类型匹配,泛型中的值为子类。
		Collection<String> l1 = new ArrayList<String>();
		l1.add("l1-aa");
		l1.add("l1-bb");	
		//Wildcard.printCollectionWithGeric(l1);//complie error:The method
		// printCollectionWithGeric(Collection<Object>) in the type Wildcard is
		// not applicable for the arguments (Collection<String>)

		// 2、参数类型匹配,泛型中的类型也匹配
		Collection<Object> l2 = new ArrayList<Object>();
		l2.add("l2-aa");
		l2.add("l2-bb");
		Wildcard.printCollection(l2);// result:l2-aal2-bb
		Wildcard.printCollectionWithGeric(l2);// result:l2-aal2-bb

		// 3.参数类型为子类,泛型中的类型匹配
		List<Object> l3= new ArrayList<Object>();
		l3.add("l3-aa");
		l3.add("l3-bb");
		Wildcard.printCollectionWithGeric(l3);// result: l3-aal3-bb
		System.out.println("--------");

		/*
		 * 二、method(Collection c) 与method(Collection<?> c)的区别 
		 * method(Collection c):调用参数据可以为Collection的子类,且对Collection中元素的类型没有限制。
		 * method(Collection<?> c):完全与method(Collection c)一样
		 */

		// 1、参数类型匹配,泛型中的值为子类。
		Collection<String> l11 = new ArrayList<String>();
		l11.add("l11-aa");
		l11.add("l11-bb");		
		 Wildcard.printCollectionWithWildGeric(l11);//result:l11-aal11-bb

		// 2、参数类型匹配,泛型中的类型也匹配
		Collection<Object> l22 = new ArrayList<Object>();
		l22.add("l22-aa");
		l22.add("l22-bb");
		Wildcard.printCollectionWithWildGeric(l22);// result:l22-aal22-bb

		// 3.参数类型为子类,泛型中的类型匹配
		List<Object> l33 = new ArrayList<Object>();
		l33.add("l33-aa");
		l33.add("l33-bb");
		Wildcard.printCollectionWithGeric(l33);// result: l33-aal33-bb

		// 泛型通配符 Collection<?> 表示集合中的元素可以为任何类型
		Collection<?> c = new ArrayList<String>();
		//c.add("aa"); // compile error:The method add(capture#2-of ?) in the type Collection<capture#2-of ?> is not applicable for the arguments (String)
		//说明: Collection<?> c :这种定义除了null不能加入任何元素,因为Collection没有指定元素类型
		

	}

}