上一节,我们基本学会了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...
上链接!
泛型类,免费!