泛型的通配符: ?
作用:
作为方法的参数集合的泛型使用,可以接收任意的数据类型
不能创建对象使用
初级使用:
我把一些注释,都写在了详细的文档中。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.cyl.demo; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 public class Demo2 { 7 public static void main(String[] args) { 8 ArrayList<Integer> list1 = new ArrayList<>(); 9 list1.add(1); 10 list1.add(2); 11 12 ArrayList<String> list2=new ArrayList<>(); 13 list2.add("hello1"); 14 list2.add("hello2"); 15 16 printArraylist(list1); 17 System.out.println("#############不同类型的分割线#############"); 18 printArraylist(list2); 19 20 21 } 22 23 /* 24 定义一个可以对,任意数据类型打印的ArrayList 25 采用三种方式打印 26 */ 27 private static void printArraylist(ArrayList<?> list) { 28 System.out.println("------迭代器遍历------"); 29 Iterator<?> it = list.iterator(); 30 while (it.hasNext()){//遍历的ArrayList,采用while 31 Object o = it.next();//采用Object来接收任意数据类型 32 System.out.println(o); 33 } 34 System.out.println("----foreach遍历----"); 35 for (Object o: 36 list) { 37 System.out.println(o); 38 } 39 System.out.println("----for循环----"); 40 for (int i = 0; i < list.size(); i++) { 41 System.out.println(list.get(i)); 42 } 43 } 44 }
运行效果图:
高级使用(泛型设定)
上限限定: ? extends E 传递的未知的数据类型?只能是E的子类,或者E本身
下限限定: ? super E 传递的未知的数据类型?只能是E的父类,或者E本身
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public static void main(String[] args) { 2 Collection<Integer> integers = new ArrayList<>(); 3 Collection<String> strings=new ArrayList<String>(); 4 Collection<Number> numbers = new ArrayList<Number>(); 5 Collection<Object> objects = new ArrayList<Object>(); 6 7 /* 8 测试一:泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类 9 */ 10 integers.add(1); 11 getElement1(integers); 12 getElement1(strings);//报错 13 getElement1(numbers); 14 getElement1(objects);//报错 15 16 /* 17 测试二:泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类 18 */ 19 20 getElement2(integers);//报错 21 getElement2(strings);//报错 22 getElement2(numbers); 23 getElement2(objects); 24 } 25 26 //此时必须是Number类型,或是Number类型的子类。 27 public static void getElement1(Collection<? extends Number> coll) { 28 System.out.println(coll); 29 } 30 31 //泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类 32 public static void getElement2(Collection<? super Number> coll) { 33 System.out.println(coll); 34 }
引申一下看下Number的API:
抽象类 Number
是 BigDecimal
、BigInteger
、Byte
、Double
、Float
、Integer
、Long
和 Short
类的超类。
Number
的子类必须提供将表示的数值转换为 byte
、double
、float
、int
、long
和 short
的方法.