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

news2024/11/20 6:33:51

上一节,我们基本学会了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.coloradmin.cn/o/495608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过gulp+rollup从零到一搭建前端组件库

核心要点 通过 webpack 搭建运行环境通过 gulp 执行编译流程通过 rollup 编译组件代码编写 组件测试 组件打包 编译组件上传 npm 1、通过 webpack 搭建运行环境 这里主要是创建一个可以运行的测试的组件的环境&#xff0c;全局安装vue-cli脚手架&#xff0c;并初始化项目 v…

代码提交格式化工具---prettier的使用与配置

为什么要格式化代码 我们在合作写项目的时候&#xff0c;因为每个人的代码书写习惯以及编辑器的配置都不相同&#xff0c;这样就可能导致我们写的代码的格式都完全不一样&#xff0c;有的代码格式看起来也比较难以阅读&#xff0c;那么prettierd就由此产生了。 Prettier是一个…

题集-链表分割

链表分割_牛客题霸_牛客网 (nowcoder.com) 链表去做的话&#xff0c;可以分为带哨兵位和不带哨兵位两种&#xff0c;但是不带哨兵位会更麻烦一些&#xff0c;更容易出现空指针问题。 这里两种思路都是&#xff1a;将小于x的结点尾插到less链表中&#xff0c;将大于x的结点尾插到…

数据结构之队列,实现队列的增删改查

目录 一、队列的定义 二、队列的实现 1.使用链表来实现队列 2.实现队列的接口 初始化队列 void QueueInit(Queue *pq) 队尾入队列 void QueuePush(Queue *pq,QDataType data) 队头出队列 void QueuePop(Queue *pq) 获取队列头部元素 QDataType QueueFront(Queue *pq) …

uni-app获取手机号-获取用户地理位置-根据位置获取经纬度跳转高德

一.获取手机号 1.获取手机号首先要先登录拿到code&#xff0c;用code去获取session_key 2.获取 code需要知道自己的AppID(小程序ID)和AppSecret(小程序密钥) 3.解密后得到手机号 登录微信公众平台拿到自己的AppID(小程序ID)和AppSecret(小程序密钥) 微信公众平台 获取sessio…

【Java EE 初阶】如何保证线程安全二

目录 1.线程不安全是什么&#xff1f; 2.线程不安全的成因 3.解决线程不安全之一Synchronized关键字&#xff08;监视器锁&#xff09; 1.Synchronized使用方法 2.锁对象是什么&#xff1f; ​3.锁对象的练习 4.Synchronized的特性 1.互斥性 2.刷新内存 3.可重入 5.总…

事务及分布式事务解决方案

基础概念 1.1.事务 事务可以看做是一次大的活动&#xff0c;它由不同的小活动组成&#xff0c;这些活动要么全部成功&#xff0c;要么全部失败。 1.2.本地事务 在计算机系统中&#xff0c;更多的是通过关系型数据库来控制事务&#xff0c;利用数据库本身的事务特性来实现&a…

SAP 从入门到放弃系列之批次追溯功能

首先执行MB57,建立批次追溯关系&#xff0c;并存储在CHVW表。根据情况选择要追溯的期间&#xff0c;在过账日期范围内填写。 不勾选‘基于清单显示’&#xff0c;为ALV显示结果 勾选‘基于清单显示’&#xff0c;为清单显示结果 执行MB56&#xff0c;查询批次追溯 可以设置显示…

【.NET AI Books 前言】Azure OpenAI Service 入门

本书是为 .NET 开发者而写的&#xff0c;让 .NET 开发者能快速掌握 Azure OpenAI Service 的使用技巧。 ChatGPT 的到来意味着我们已经置身于 AI 引起的全新变革中&#xff0c;作为开发者你可能将面临几种改变&#xff1a; GPT 模型到来后&#xff0c;如何去架构好企业解决方案…

Dex-Net 2.0<论文>

题目&#xff1a;Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp 引言 传统抓取方法的局限性 缺乏泛化能力需要大量计算资源和手工标注数据【前两种依赖物体形状、材料、质量等先验知识通常要对物体建模姿态评估运动学分析】只能处理…

【C语言】深入理解注释

文章目录 一. 预处理阶段对注释的处理二. 注释使用时的注意事项1. C风格的注释无法嵌套使用2. 基本注释注意事项3. 注释导致的二义性 四. 关于注释的一个使用建议 一. 预处理阶段对注释的处理 我们知道一个源文件要变成可执行程序的话&#xff0c;首先要经过预处理&#xff0c…

Vtk7.1.1+PCL1.12.0安装

错误可参考&#xff1a;Ubuntu20.04 编译 pcl1.8可能出现的问题 安装参考1&#xff1a;ubuntu20.04下安装pcl_ubuntu安装pcl_Yuannau_jk的博客-CSDN博客 安装参考2&#xff1a;Ubuntu20.04 安装pcl详细教程_ubuntu20.04安装pcl_LYiiiiiii的博客-CSDN博客 安装参考3&#xff1a…

涨知识!你不知道的中国手机号码的编码和划分规则

引言 在当今信息化的时代&#xff0c;移动电话号码已经成为人们日常生活中必不可少的联系方式。中国作为世界上拥有庞大人口数量的国家之一&#xff0c;移动电话号码的编码和划分显得尤为重要。 中国的移动电话号码分为三大运营商&#xff0c;每个运营商又有自己的号码段&…

Spring Security OAuth2.0(三)-----基于Redis存储和JDBC存储

问题 令牌往哪里存&#xff1f; 客户端信息入库 第三方应用优化 1.令牌往哪里存&#xff1f; 在我们配置授权码模式的时候&#xff0c;有两个东西当时存在了内存中&#xff1a; InMemoryAuthorizationCodeServices 这个表授权码存在内存中。InMemoryTokenStore 表示生成的令…

open3D

一、说明 对于点云 处理&#xff0c;这里介绍哦pen3d&#xff0c;该软件和opencv同样是interl公司的产品。 Open3D 是一个开源库&#xff0c;支持快速开发处理 3D 数据的软件。 Open3D 前端在 C 和 Python 中公开了一组精心挑选的数据结构和算法。后端经过高度优化&#xff0c;…

Spring Boot处理CORS跨域请求的三种方法

1 前言 Springboot跨域问题&#xff0c;是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点 跨域只存在于浏览器端&#xff0c;不存在于安卓/ios/Node.js/python/ java等其它环境跨域请求能发出去&#xff0c;服务端能收到请求并正常返回结果&#xff0c;只是结…

05-权限分配 尚筹网

权限控制 权限控制机制的本质就是“用钥匙开锁”。 在实现权限控制之前&#xff0c;这里先完成给Admin分配Role和给Role分配Auth的功能。 一、给Admin分配Role 目标 ​ 通过前端页面操作&#xff0c;将Admin与Role之间的关系保存到数据库 思路 ​ 给下面的按钮&#xff…

【ED合集】事件检测的文章

1 CorED: Incorporating Type-level and Instance-level Correlationsfor Fine-grained Event Detection 论文来源&#xff1a;SIGIR 2022(CCF A类会议) 论文链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3477495.3531956 代码链接&#xff1a;GitHub - JiaweiSheng…

抖音小程序|基于天气API实现天气预报功能

文章目录 一、前言包含了功能UI展示 二、开发前的准备三、开发步骤1.app.js 配置2.pages/index.js 演示二维码源码在百度网盘下载 一、前言 参考老版iPhone自带的天气预报APP。目前只有一个界面UI, 后续会更新出更多功能; 包含了功能 - 实况预报 - 未来48小时 - 未来一周的天…

动态gif图片如何在线做?轻松实现图片在线生成gif

常见的jpg、png格式的静态图片想要变成gif格式的动态图片时&#xff0c;要怎么办呢&#xff1f;有没有什么简单实用的gif制作工具呢&#xff1f; 一、什么工具能够在线制作gif&#xff1f; GIF中文网作为一款专业的gif制作&#xff08;https://www.gif.cn/&#xff09;工具&a…