黑马程序员技术交流社区

标题: 【成都校区*文章*】java通配符 [打印本页]

作者: 小蜀哥哥    时间: 2019-9-25 18:45
标题: 【成都校区*文章*】java通配符
在java中,?代表通配符。

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

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

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

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

[Java] 纯文本查看 复制代码
List<? extends Number> list=null;

list=new ArrayList<Integer>();

list.add(new Integer(1));//报错,因为list不能确定实例化的对象具体类型导致add()方法受限

...

list.get(0);//正确


正确用法:
[Java] 纯文本查看 复制代码

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] 纯文本查看 复制代码

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] 纯文本查看 复制代码
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 通配符
如果你既想存,又想取,那就别用通配符
不能同时声明泛型通配符上界和下界







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2