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没有指定元素类型
}
}