文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

了解java中的通配符“?“

2023-09-17 19:51

关注

目录

通配符的作用

        先看一段代码

        用通配符"?"后,代码变化

        结论

通配符上界 

通配符下界

对通配符上下界的注释理解及其练习代码  


简记: ?  用于在泛型的使用,即为通配符.
在Java中,通配符(wildcard)主要用于泛型编程,用于表示一个不确定的类型。
通配符有三种形式:1.通配符  2.通配符   3. 通配符

通配符的作用

先看一段代码

class Test0 {    public static void main(String[] args) {        System.out.println("===========1.String==============");        Message message1 = new Message<>();        message1.setMessage("fly in the sky!");        fun1(message1);        System.out.println("===========2.Integer=============");        Message message2 = new Message<>();        message2.setMessage(99);        fun2(message2);        System.out.println("===========3.Character============");        Message message3 = new Message<>();        message3.setMessage('s');        func3(message3);        System.out.println("===========4.Short================");        Message message4 = new Message<>();        message4.setMessage((short) 213);        func4(message4);        System.out.println("===========5.Long=================");        Message message5 = new Message<>();        message5.setMessage(1024L);        func5(message5);        System.out.println("===========6.Float=================");        Message message6 = new Message<>();        message6.setMessage(3.1415926f);        func6(message6);        System.out.println("===========7.Double================");        Message message7 = new Message<>();        message7.setMessage(1024.0213);        func7(message7);        System.out.println("===========8.Boolean===============");        Message message8 = new Message<>();        message8.setMessage(true);        func8(message8);    }    public static void fun1(Message tmp) {        System.out.println(tmp.getMessage());    }    public static void fun2(Message tmp) {        System.out.println(tmp.getMessage());    }    public static void func3(Message tmp) {        System.out.println(tmp.getMessage());    }    public static void func4(Message tmp) {        System.out.println(tmp.getMessage());    }    public static void func5(Message tmp) {        System.out.println(tmp.getMessage());    }    public static void func6(Message tmp) {        System.out.println(tmp.getMessage());    }    public static void func7(Message tmp) {        System.out.println(tmp.getMessage());    }    public static void func8(Message tmp) {        System.out.println(tmp.getMessage());    }}

用通配符"?"后,代码变化

class Test1 {    public static void func(Message temp) {        System.out.println(temp.getMessage());    }    public static void main(String[] args) {        System.out.println("===========1.String==============");        Message message1 = new Message<>();        message1.setMessage("fly in the sky!");        func(message1);        System.out.println("===========2.Integer=============");        Message message2 = new Message<>();        message2.setMessage(99);        func(message2);        System.out.println("===========3.Character============");        Message message3 = new Message<>();        message3.setMessage('s');        func(message3);        System.out.println("===========4.Short================");        Message message4 = new Message<>();        message4.setMessage((short) 213);        func(message4);        System.out.println("===========5.Long=================");        Message message5 = new Message<>();        message5.setMessage(1024L);        func(message5);        System.out.println("===========6.Float=================");        Message message6 = new Message<>();        message6.setMessage(3.1415926f);        func(message6);        System.out.println("===========7.Double================");        Message message7 = new Message<>();        message7.setMessage(1024.0213);        func(message7);        System.out.println("===========8.Boolean===============");        Message message8 = new Message<>();        message8.setMessage(true);        func(message8);    }}

结论

结论:使用通配符"?"可以接收所有的泛型类型,从而大大减少代码量,


 注:虽然通配符 "?" 可以接受任意类型,但正因为如此,由于不确定类型,所以在func方法中无法修改操作


在"?"的基础上又产生了两个子通配符: 
? extends 类:设置通配符上限 =>  通配符上界
? super 类:设置通配符下限 =>  通配符下界

通配符上界 

通配符上界
语法:

//可以传入的实参类型是String或者String的子类

通配符的上界,不能进行写入数据,只能进行读取数据

 通配符下界

通配符下界                                                                                                             
语法:
                            
//代表 可以传入的实参的类型是 Integer或者 Integer的父类类型 

通配符的下界,不能进行读取数据,只能写入数据

class Food {}class Fruit extends Food {}class Apple extends Fruit {}class Banana extends Fruit {}

对通配符上下界的注释理解及其练习代码  

class Food {}class Fruit extends Food {}class Apple extends Fruit {}class Banana extends Fruit {}class Plate {//设置泛型    private T message;    public T getMessage() {        return message;    }    public void setMessage(T message) {        this.message = message;    }}public class Test2 {    public static void main1(String[] args) {        Plate applePlate = new Plate<>();        applePlate.setMessage(new Apple());        func1(applePlate);        Plate bananaPlate = new Plate<>();        bananaPlate.setMessage(new Banana());        func1(bananaPlate);    }    //通配符的上界    //通配符的上界,不能进行写入数据,只能进行读取数据    public static void func1(Plate tmp) {        //这里仍然不可以进行修改!tmp接收的是Fruit和他的子类,此时存储的元素应该是哪个子类无法确定。        System.out.println(tmp.getMessage());        Fruit b = tmp.getMessage();//向上转型        System.out.println(b);    }    //通配符的下界    //通配符的下界,不能进行读取数据,只能写入数据    public static void main(String[] args) {        Plate fruitPlate = new Plate<>();        fruitPlate.setMessage(new Fruit());        func2(fruitPlate);        Plate foodPlate = new Plate<>();        foodPlate.setMessage(new Food());        func2(foodPlate);    }    public static void func2(Plate tmp) {        //传入参数为Fruit及其父类 ,        //此时可以修改!!添加的是Fruit 或者Fruit的子类        tmp.setMessage(new Apple());        tmp.setMessage(new Fruit());        //不能接收,这里无法确定是哪个父类,父类太多了    }}

  
 

来源地址:https://blog.csdn.net/m0_73740682/article/details/132580799

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯