java通配符

 

 

在java中,?代表通配符。

通配符用法
1. 在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义

2. <? extends Object>代表上边界限定通配符

3. <? super Object>代表下边界限定通配符。

上边界限定通配符
上边界通配符直接使用add()方法受限,但是可以用来获取各种数据类型的数据,并赋值给父类型的引用。

[Java] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
List<? extends Number> list=null;
 
list=new ArrayList<Integer>();
 
list.add(new Integer(1));//报错,因为list不能确定实例化的对象具体类型导致add()方法受限
 
...
 
list.get(0);//正确


正确用法:
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.util.ArrayList;
 
import java.util.List;
 
 
 
public class Main {
 
    public static void main(String[] args) {
 
        firstPrint();
 
        secondPrint();
 
    }
 
 
 
    public static void firstPrint() {
 
        List<Float> list1 = new ArrayList<>();//使用 Float作实参类型
 
        list1.add(12.3f);
 
        list1.add(23.4f);
 
        print(list1);
 
    }
 
 
 
    public static void secondPrint() {
 
        List<Integer> list2 = new ArrayList<>();//使用Integer作实参类型
 
        list2.add(1);
 
        list2.add(2);
 
        list2.add(3);
 
        print(list2);
 
    }
 
 
 
    public static void print(List<? extends Number> list) {// 通配符作形参
 
        for (int i = 0; i < list.size(); i++) {
 
            System.out.println(list.get(i));// 使用get方法
 
        }
 
    }
 
}


下边界限定通配符
下边界通配符使用get()方法受限(不使用强转),但是可以添加特定类型的值,用于将对象写入到一个数据结构里
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
List<? super Integer> list = null;
 
list = new ArrayList<Number>();
 
list.add(1);
 
Number number = list.get(0);//报错,因为List<? super Integer>不知道list存放的对象具体类型,则使用get获取到的值不确定。
 
...
 
list.add(1);//正确




正确用法:

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.util.ArrayList;
 
import java.util.List;
 
 
 
public class Main {
 
    public static void main(String[] args) {
 
        List<Number> list = new ArrayList<>();
 
        firstInflate(list);
 
        for (int i = 0; i < list.size(); i++) {
 
            System.out.println(list.get(i));
 
        }
 
        list.clear();
 
        secondInflate(list);
 
        for (int i = 0; i < list.size(); i++) {
 
            System.out.println(list.get(i));
 
        }
 
    }
 
 
 
    public static void firstInflate(List<? super Integer> list) {// 装填整数
 
        list.add(1);
 
        list.add(2);
 
        list.add(3);
 
    }
 
 
 
    public static void secondInflate(List<? super Float> list) {// 装填浮点数
 
        list.add(1.1f);
 
        list.add(2.2f);
 
        list.add(1.3f);
 
    }
 
}


总结
列表内容
限定通配符总是包括自己
上界类型通配符:add方法受限
下界类型通配符:get方法受限
如果你想从一个数据类型里获取数据,使用 ? extends 通配符
如果你想把对象写入一个数据结构里,使用 ? super 通配符
如果你既想存,又想取,那就别用通配符
不能同时声明泛型通配符上界和下界
posted @ 2020-04-27 09:12  幽暗森林之猪大屁  阅读(204)  评论(0)    收藏  举报