泛型的通配符: ?

作用:
作为方法的参数集合的泛型使用,可以接收任意的数据类型
不能创建对象使用

初级使用:

我把一些注释,都写在了详细的文档中。



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 }

View Code

运行效果图:

泛型通配符实例_子类

 

 高级使用(泛型设定)

上限限定: ? extends E 传递的未知的数据类型?只能是E的子类,或者E本身
下限限定: ? super E 传递的未知的数据类型?只能是E的父类,或者E本身



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 }

View Code

 

引申一下看下Number的API:

 

抽象类 ​​Number​​​ 是 ​​BigDecimal​​​、​​BigInteger​​​、​​Byte​​​、​​Double​​​、​​Float​​​、​​Integer​​​、​​Long​​​ 和 ​​Short​​ 类的超类。

​Number​​​ 的子类必须提供将表示的数值转换为 ​​byte​​​、​​double​​​、​​float​​​、​​int​​​、​​long​​​ 和 ​​short​​ 的方法.

泛型通配符实例_数据类型_02

 

泛型通配符实例_子类_03

泛型通配符实例_泛型_04