一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情。
哈喽,各位小伙伴们好,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。
我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!
一、前言
论前几期啊,我们是分别讲了Object类、Date类、FormDate类、Calendar类、System类及StringBuilder类,不知道大家掌握的如何,如果没有及时巩固的同学,可以看我这里,我给大家罗列了下,快速学习通道,只希望能帮助到大家更好的学习与成长,这就是我写作的初衷。
接下来,我要给大家讲一个新东西了啊。虽然每天一期新类,但是我会尽量控制文章篇幅,让大家都有个很好的体验。如果不清楚,可以看看我接下来演示的,我会做到句句重点!绝不废话。
二、泛型
1、概述
在学习之前,我要给个问题得先考考大家,在学习前面的集合时,我们都知道集合中是可以存放任何引用类型的,比如对象。只要把对象往集合中存,那么这时候该对象都会被提升成Object类型。当我们进行遍历取出该集合中的所有元素时,并且进行对应的操作,这时你可能要做的一件事就是类型转换。
为什么要类型转换?大家肯定百思不得其解,那是因为String类型存进去,会自动转成Object类,所以你要取String类型去接收,你就得类型转化了。如果还不是很能明白的,请看下方这则实例,结合实例你就能理解了。
实例如下:
@Test
public void test() {
//创建一个集合对象。
Collection collection = new ArrayList();
//添加元素到集合中
collection.add("后羿");
collection.add("赵云");
collection.add("李白");
collection.add(100);//由于集合没有做任何类型限定,所以任何类型都可以添加。
//构建迭代器
Iterator iterator = collection.iterator();
//打印输出
while (iterator.hasNext()) {
String value = (String) iterator.next();
System.out.println(value);
}
}
具体运行控制台输出截图:
很诧异,有没有,竟然爆错了。
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 提示的很明了了,不能将Integer类型转成String类型,这是啥情况?为什么会发生类型转换异常报错呢?
我们来分析下,由于我们定义集合没有指定存放类型,所以什么类型都能进行存放,可看示例我是将一个int性的数字与字符串汉字一并存到了里头,导致在取出打印的时候由于强行转化便运行直接报错ClassCastException。
那怎么来解决这个问题呢?Collection集合虽然可以存放各种对象,但通常实际上Collection只存储同一类型的对象值。例如都是int值,字符串等。
因此,在jdk5之后,就引入了泛型(Generic)语法。它的出现,目的就是让你在进行api设计时,可以指定类或方法支持泛型化,这样也就可以让我们在使用api时变得更加可易维护、拓展且变得简洁,且还得到了程序编译时期的语法检查。
绝绝子,所以大家好好学习这一期内容。
2、使用范围
泛型,可以在你的类或方法中预支的使用未知的类型,也就是泛型化。但你没有指定泛型时,就像上述示例,自动转化成Object对象类型。
如果你要指定泛型,你就可以这么干:
比如:
Collection<String> collection = new ArrayList<String>();
Collection<Integer> collection = new ArrayList<Integer>();
这样当你在进行上述示例时,直接就会给你报错,编译都通过不了。
截图演示:
直接会提醒你,将Integer类转成String类才接收。
具体就比如这样:通过String类提供的valueOf()方法进行转换。
这样,由于指定了String泛型,这个集合你就只能插入同一类型的元素,否则就无法正常运行,这就是语法检查机制,完全避免你编译才报错的可能性,直接拦击在运行前。
3、优势
其实我上述也讲了一些泛型的好处,对吧,想必大家通过我上方列举的这些示例,就对此也有了个大概的了解,但是我来更官方的总结一下,它有啥具体优势吧。
- 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
- 避免了类型强转的麻烦,比如上述,直接强制报错场景。
- 更加简单明了化方法或类。
比如如下示例,我再给大家演示一把,定一个只插入数值型的集合吧。
具体代码如下:
@Test
public void test() {
//创建一个集合对象。
Collection<Integer> collection = new ArrayList<Integer>();
//添加元素到集合中
collection.add(1);
collection.add(10);
collection.add(50);
collection.add(100);
//构建迭代器
Iterator<Integer> iterator = collection.iterator();
//打印输出
while (iterator.hasNext()) {
//获取值
Integer value = iterator.next();
//输出
System.out.println(value);
}
}
具体运行截图如下:
... ...
好啦,以上就是本期内容的全部教学内容啦,如果对文中的任何知识点有疑问,欢迎评论区评论留言呀,我看见都会一一解答的。
如果还想学习更多有关泛型的知识点,你可以看下我写的这篇《java之泛型下篇》
三、结尾
教学是结束了,但是有些话不知我但讲不当讲,啊哈哈, 可我还是想说给你们听听。如下是我很喜欢的一句话,我打算送给你们,希望我们都能变得更好更优秀。
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
-------------------------------------------
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
-------------------------------------------