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