震惊,为了学会泛型类竟做这种事?!

上一节,我们基本学会了Java泛型类的用法。

传送门:彻底弄懂Java的泛型 - 泛型类

这一节,我们转变一下风格,具体是什么风格呢,你马上就懂了。

宝子们,欢迎大家来到我们的泛型直播间,这一讲呢,真的是非常的难得,我给大家带福利来了。

是的!

到底是什么福利呢,上次来看的家人们肯定知道,上一节我们给大家讲了泛型类的用法对不对。

大家想不想复习一下啊?

想!

欢迎孤独的狼来到直播间,那么我也不废话了,直接上代码:

/**
 * 专门任何东西的类
 */
@Data
public class WhatEverPrinter<T> {
    //这是需要打印的东西
    private T whatToPrint;

    public void print(){
        System.out.println(whatToPrint);
    }
}

哇,看到没有,WhatEverPrinter是一个泛型类。

是的

为什么要用泛型类呢,因为我这个类的作用是来打印东西的,就是用System.out.println把你要打印的东西打印出来,对不对?

如果不用泛型T,那么不同类型的数据,要用不同的类来打印,这样很不方便对不对?

对的

可是呢,WhatEverPrinter是一个简单泛型类,泛型类还有其他更强大的功能哦。机会难得,今天呢,我们毫无保留,全部把泛型类的各种用法教给大家,好不好?

好的

欢迎刚来的宝宝,点击关注主播,等一下关注达到100个人以后我们就开始讲啦。

好的,现在开始啦。其实啊,在Java的集合框架中,泛型类就无处不在。

最常见的,就是List接口。

public interface List<E> extends Collection<E> {...}

这个E和T是一个意思,代表某一个类型。

我们来看一下怎么用?

先来一个Cat类好不好。

public class Cat {
}

猫很可爱,对不对,可是狗狗也很可爱,所以再来一个Dog类。

public class Dog {
}

哇,猫和狗都有了,接下来干什么呢?

对了,我们用List来装,先来装猫,好不好?

好的

各位宝宝们,今天开场我就给大家炸一单,用List来装一只猫!

我数三个数,来,3....2....1,开整!

叮叮叮~~

List<Cat> cats = new ArrayList<>();
cats.add(new Cat());   

装进去没有,来,我可以很负责地告诉大家,肯定是装进去了。

因为,我们给List设置了泛型参数Cat,代表这个List只能用来装猫,对不对?

对的

没错,cats是一个List,加了泛型Cat,只能用来装猫,但如果我用它来装狗,会怎么样呢?

有没有知道的?知道的家人们在公屏上打个1哈。

来,上代码:

哇哇哇,看到没有,报错了对不对?

对的

为什么会报错呢?

那是因为,List已经加了Cat泛型,就只能装Cat了,不能装Dog。

那假如说,我既要装猫,也要装狗,怎么办?

很简单,去掉泛型呗!

不报错了,对不对,家人们,你有没有发现,为什么变黄了?

刚刚还是白的,来,idea给了我们提示:

意思是说,List类型没有指定泛型,是不安全的。

嗯,不安全??

家人们,不安全可不行,为什么?

来,小礼物刷起来,让我看到你们的热情好不好?

好的

感谢孤独的狼送的100个掌声,还没停吗?

150个了,200个了,哇,炫迈牌的掌声完全停不下来!

非常感谢。

好了,我也不卖关子了,现在就给大家演示,为什么不行。

比如我现在List加了一个猫和一个狗,我要去获取猫怎么办?

哇,又报错了,为什么呢?

因为List你不加泛型,编译器默认就觉得是object,你返回一个Object的东西,怎么赋值给Cat呢?

大家想,是不是这个道理?

是的

我看到有人提问,get(0)取到的就是Cat啊,对的,但这是你自己知道,编译器可不知道啊。那怎么办,来,宝子们,只能强转啦。

Cat cat = (Cat) cats.get(0);

这样可以解决问题,但还是不够保险,如果cats.get(0)取出来的是Dog,就要报错了!

说了这么多,我要告诉大家的就是,泛型的作用主要就是给类限定一个范围,尽可能防止出错。

有界泛型

接下来,我们介绍一种泛型类的新用法,叫做有界泛型。

哇,很酷的名字对不对。

是的

还有比这更酷的名字吗?

没有

感谢沧海一粟进入直播间。

好的,我们刚才定义了猫类和狗类,有没有办法让我们的WhatEverPrinter同时拥有打印猫和狗的方法呢?

没有

到底有没有?

答案肯定是有的,首先我们想,猫和狗是不是都是动物?

是的

那么我们可以新建一个Animal类,让Cat和Dog都去继承。

public class Animal {
}
public class Cat extends Animal{
}
public class Dog extends Animal{
}

然后,可以用来打印猫:

WhatEverPrinter<Animal> printer = new WhatEverPrinter<>();
printer.setWhatToPrint(new Cat());
printer.print();

也可以打印狗:

WhatEverPrinter<Animal> printer = new WhatEverPrinter<>();
printer.setWhatToPrint(new Dog());
printer.print();

最好呢,WhatEverPrinter我们也改写一下:

@Data
public class WhatEverPrinter<T extends Animal> {
    //这是需要打印的东西
    private T whatToPrint;

    public void print(){
        System.out.println(whatToPrint);
    }
}

T extends Animal代表T是Animal的子类,之所以叫有界泛型,就是给T增加了范围,只允许是Animal的子类。

太酷啦。

宝子们,让我们总结一下:泛型类是普通类的扩展,泛型类有一个特点,就是可以用来设置未知的参数和变量,提升了类的可扩展性,对集合对象来说还可以提升安全性。

集合类呢,jdk一般都给我们封装好了,我们用的比较多的就是List和Map。

那么,如果宝子们有自己封装一些工具类啊,一些公共方法啊,为了让自己的类更具扩展性,是可以考虑使用我们的泛型类的!

是的

之前我有个朋友,做批量删除功能,一般我们前端不是会传一些id序号到Controller嘛,他就干脆直接封装了一个类,用的就是泛型T:

private List<T> ids;

到时候用的时候,T可能是Integer,也可能是String。

不仅如此,各大框架里面,泛型类用的也是非常多。

典型的,我们用MybatisPlus构造QueryWrapper的时候,是不是总要指定一个类型,那不也是泛型类嘛。

QueryWrapper<User> wrapper = new QueryWrapper<User>();

没错

好了,泛型类有这么多的好处,肯定是值得我们学习和使用的!

不用想,直接拍,只有我们这里有这样的价格,往后只会越来越贵。

我数3个数,3....2....1...

上链接!

泛型类,免费!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/17446.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansible的脚本-playbook 剧本

目录 1.剧本&#xff08;playbook&#xff09; 1.playbook介绍 2. playbooks 的组成 3.案例&#xff1a;编写httpd的playbook 4.定义、引用变量 5.指定远程主机sudo切换用户 6.when条件判断 7.迭代 2.playbook的模块 1.Templates 模块 2.tags 模块 3.Roles 模块 1.…

【Linux从入门到精通】vim的基本使用各种操作详解

文章目录 一、vim编辑器简单介绍 二、vim编辑器的四种模式 2、1 正常/普通/命令模式(Normal mode) 2、2 插入模式(Insert mode) 2、3 末行模式(last line mode) 三、命令模式的相关操作实例 3、1 光标的相关操作 3、2 文本操作 四、插入模式下的相关操作 五、末行模式下的相关操…

Java—JDK8新特性—函数式接口

目录 函数式接口 3.1 什么是函数式接口 3.2 functionalinterface注解 源码分析 3.3 Lambda表达式和函数式接口关系 3.4 使用函数式接口 函数式接口 3.1 什么是函数式接口 如果一个接口中只包含一个抽象方法&#xff0c;这个接口称为函数式接口 如果一个接口包含&#xff0…

K8S管理系统项目实战[API开发]-2

后端: gogin 后端代码地址GitHub - yunixiangfeng/k8s-platform: K8s管理系统后端: gogin 5、存储与配置 5.1 ConfigMap 5.2 Secret 5.3 PersistentVolumeClaims 6、工作流 6.1 流程设计 6.2 数据库操作&#xff08;GORM&#xff09; &#xff08;1&#xff09;初始化…

交换机-Exchanges

交换机 Exchanges 概念 RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上&#xff0c;通常生产者甚至都不知道这些消息传递传递到了哪些队列中。相反&#xff0c;生产者只能将消息发送到交换机(exchange)&#xff0c;交换机工作的内容非常简…

正则表达式-基本元字符和语法规则

© Ptw-cwl 文章目录 字符匹配元字符.元字符[]元字符[^]元字符*元字符元字符?元字符{}元字符|元字符()元字符^元字符$元字符\元字符\d元字符\w元字符\s元字符\b元字符\B元字符*?、?、??、{n,m}?元字符(?)、(?!)元字符(?:)元字符\1、\2等元字符^、$元字符&#x…

JavaSE基础(二)—— 类型转换、运算符、键盘录入

目录 一、类型转换 1. 自动类型转换 1.1 自动类型转换的底层原理&#xff1a; ​1.2 自动类型转换的其他形式​编辑 2. 表达式的自动类型转换 3. 强制类型转换 3.1 强制类型转换底层原理​编辑 3.2 注意事项 二、运算符 1. 算数运算符 1.1 案例&#xff1a;数值拆分…

PCA主成成分分析例题详解

主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;其能反映出原始数据的大部分信息 需要了解具体细节可看此视频&#x1f449;&#xff1a;什么是主成成分分析PC…

Linux安装MongoDB数据库,并内网穿透远程连接

文章目录 前言1. 配置Mongodb源2. 安装MongoDB3. 局域网连接测试4. 安装cpolar内网穿透5. 配置公网访问地址6. 公网远程连接7. 固定连接公网地址8. 使用固定地址连接 转载自Cpolar Lisa文章&#xff1a;Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网穿透」 前言 …

SpringBoot访问静态资源

SpringBoot项目中没有WebApp目录&#xff0c;只有src目录。在src/main/resources下面有static和templates两个文件夹。SpringBoot默认在static目录中存放静态资源&#xff0c;而templates中放动态页面。 static目录 SpringBoot通过/resources/static目录访问静态资源&#xff…

完成A轮融资,倍思如何发力场景化为品牌创造广阔未来?

凛冬过后的消费电子正在重新凝聚资本的目光。 近日&#xff0c;深圳市倍思科技有限公司宣布完成由深创投、中金资本联合领投&#xff0c;越秀产业基金、高榕资本跟投&#xff0c;金额数亿元人民币的A轮融资。 分析人士指出&#xff0c;消费电子的行业景气度在逐渐恢复&#x…

中国社科院与美国杜兰大学金融管理硕士项目——迎接立夏,切莫忘记自我成长

五月的风吹走了春季&#xff0c;今天我们迎来立夏。作为夏季的第一个节气&#xff0c;立夏常被人们当做万物蓄满能量&#xff0c;即将加速生长的标志。而在职的我们&#xff0c;也应该跟这世间万物一样&#xff0c;在季节交替之时沉淀自己、努力向上成长。在社科院与杜兰大学金…

“人工智能教父”从谷歌离职 称后悔发展AI,为世人敲响警钟?

在加入谷歌的第十年、深度学习迎来爆发式发展的当下&#xff0c;被誉为“人工智能教父”的Geoffrey Hinton已从谷歌离职&#xff0c;只是为了告诫人们AI已经变得很危险。 公开资料显示&#xff0c;Geoffrey Hinton在2013年加入谷歌&#xff0c;曾任副总裁&#xff0c;研究机器学…

成为数据分析师,需要具备哪些技能?

随着互联网的发展&#xff0c;数据分析师的特点越来越明显&#xff0c;对数据分析师综合素质的要求也较高。 1、较强的数据挖掘、信息整理、和逻辑分析能力 数据分析&#xff0c;也是数据分析师的一个方向。 制作日常性的经营报表&#xff0c;对公司或者行业KPI指标进行拆解…

Mysql索引(3):索引分类

1 索引分类 在MySQL数据库&#xff0c;将索引的具体类型主要分为以下几类&#xff1a;主键索引、唯一索引、常规索引、全文索引。 分类含义特点关键字主键索引针对于表中主键创建的索引 默认自动创建, 只能有一个 PRIMARY 唯一索引 避免同一个表中某数据列中的值重复可以有多…

【Android入门到项目实战-- 8.4】—— 如何解析JSON格式数据

目录 一、准备工作 二、使用JSONObject 三、使用GSON 比起XML&#xff0c;JSON的主要优势在于它的体积更小&#xff0c;在网络上传输的时候可以更省流量&#xff0c;但缺点是语义性较差&#xff0c;看起来不直观。 一、准备工作 还是使用前面文章的方法&#xff0c;在服务器…

每日学术速递4.29

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.A Cookbook of Self-Supervised Learning 标题&#xff1a;自监督学习食谱 作者&#xff1a;Randall Balestriero, Mark Ibrahim, Vlad Sobal, Ari Morcos, Shashank Shekhar, Tom…

【黑马程序员 C++教程从0到1入门编程】【笔记8】 泛型编程——模板

https://www.bilibili.com/video/BV1et411b73Z?p167 C泛型编程是一种编程范式&#xff0c;它的核心思想是编写通用的代码&#xff0c;使得代码可以适用于多种不同的数据类型。 而模板是C中实现泛型编程的一种机制&#xff0c;它允许我们编写通用的代码模板&#xff0c;然后在需…

【Spring篇】IOC/DI注解开发

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、IOC/DI注解开发 1.注解开发定义bean 2.纯注解开发模式 1.思路分析 2.实现步骤 3.注解开发bean作用范围与生命周期管理 1.环境准备 2.Bean的作用范围 3.Bean的生命周期 4.注解开发依赖…

相当Python程序员,选择培训班还是自学?我结合自己的经历谈谈看法

前几天我写了一篇文章&#xff0c;分享了自己当上程序员的经历。然后&#xff0c;我收到了很多小伙伴的提问&#xff0c;都在问同一个问题&#xff0c;即如何选择报培训班还是自学。今天&#xff0c;我结合自己的个人经历&#xff0c;来谈一下个人的看法。 我认为这个问题的第…