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 通配符
如果你既想存,又想取,那就别用通配符
不能同时声明泛型通配符上界和下界

更多免费技术资料可关注:annalin1203

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值