泛型通配符实例
原创
©著作权归作者所有:来自51CTO博客作者chenyanlong的原创作品,请联系作者获取转载授权,否则将追究法律责任
泛型的通配符: ?
作用:
作为方法的参数集合的泛型使用,可以接收任意的数据类型
不能创建对象使用
初级使用:
我把一些注释,都写在了详细的文档中。
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
的方法.