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

2024-02-17 16:10
文章标签 学会 泛型 这种 震惊

本文主要是介绍震惊,为了学会泛型类竟做这种事?!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一节,我们基本学会了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.chinasem.cn/article/718302

相关文章

为何我建议你学会抄代码?

文章目录 为何我建议你学会抄代码?一、引言二、抄代码的艺术1、理解抄代码的真正含义1.1、抄代码的好处 2、如何有效地抄代码2.1、发现问题2.2、整理需求2.3、造轮子标准流程 三、抄代码的实践案例1、发现问题2、整理需求3、设计重试机制4、实现重试工具类5、使用重试工具类6、优化和扩展 四、总结 为何我建议你学会抄代码? 一、引言 在编程的世界中,“抄代码” 常被视为一

Java泛型类型解析

解析泛型类型 获取字段泛型类型 **java.lang.reflect.Field#getGenericType**: 作用:返回字段的泛型类型。返回类型:Type。如果字段是一个泛型类型,这个方法将返回一个表示这个泛型类型的 Type 对象,比如 ParameterizedType,TypeVariable 等等。如果字段不是泛型类型,这个方法将返回字段的具体类型,即 Class 对象。示例

【数据结构】--初识泛型

1. 包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 1.2 (自动)装箱和(自动)拆箱 装箱(装包): 把 基本数据类型 变为 包装类类型 的过程 叫做装箱。 反汇编指

泛型参Class、Class、Class的对比区别

1.原文链接 泛型参Class、Class、Class的对比区别 https://blog.csdn.net/jitianxia68/article/details/73610606 <? extends T>和<? super T> https://www.cnblogs.com/drizzlewithwind/p/6100164.html   2.具体内容: 泛型参数Class、

Java|泛型的使用

文章目录 概述泛型的基本概念泛型类示例 泛型方法示例 泛型接口示例 泛型的类型参数约束示例 通配符(Wildcard)上界通配符(`? extends T`)下界通配符(`? super T`) 泛型的类型擦除类型擦除的影响 泛型中的常见限制泛型的优点 总结 概述 泛型(Generic)是 Java 5 引入的一项特性,它允许类、接口和方法可以处理任何类型的数据,而不必指定具体

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行:nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​ 输出格式 单个整数:表示最长的前缀长度,使得前缀的和大于等于 00 数据范围

上海市计算机学会竞赛平台2024年8月月赛丙组等差数列的素性

题目描述 给定三个整数 nn,aa 与 dd,表示一个项数为 nn 的等差数列,首项为 aa,公差为 dd。 请统计,从这个等差数列中有多少数字是素数 输入格式 三个整数: nn,aa 与 dd 输出格式 单个整数:表示素数数量 数据范围 50%50% 的数据,1≤n≤10001≤n≤1000100%100% 的数据,1≤n≤100001≤n≤100001≤d≤10001≤d≤10

hibernate泛型Dao,让持久层简洁起来

【前言】hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据库。同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么我们在项目中如何灵活应用hibernate,也会给项目维护以及项目开发带来便利,下面我将展示我们项目中是如何来对hibernate进行应用和操作。 【目录】              -

【数据结构】你真的学会了二叉树了吗,来做一做二叉树的算法题及选择题

文章目录 1. 二叉树算法题1.1 单值二叉树1.2 相同的树1.3 另一棵树的子树1.4 二叉树的遍历1.5 二叉树的构建及遍历 2. 二叉树选择题3. 结语 1. 二叉树算法题 1.1 单值二叉树 https://leetcode.cn/problems/univalued-binary-tree/description/ 1.2 相同的树 https://leet

dart 中的 泛型 怎么写??

import 'package:flutterdemo/bean/MyUser.dart';class BaseResp<T> {int code;String str;T data;BaseResp({this.code, this.str, this.data});BaseResp.fromJson(Map<String, dynamic> jsonStr) {code = jsonStr['