• 如何通俗易懂地理解什么叫泛型?


    补充学习一个知识点:泛型。这个概念是在集合中接触到的,因为当时学的有点懵,所以就没有立马写出来。

    现在回过头来看,发现还是蛮简单的。

    一、泛型的概念

    先回顾下集合和数组的区别:

    • 数组长度固定不变,可以存放任意数据类型,但存放的数据类型要一致。
    • 集合长度可变,可以存放任意引用数据类型,但存储的数据类型可以不一致。

    也就是说一个集合既可以存放String类型的数据又可以存放Integer类型数据(int对应的引用数据类型)。

    这样就会出现一个问题:

    比如说:现在有一个集合,打算存储群里所有人的名字,结果有的人捣乱把年龄也存进去了。

    这个时候编译是不会报错的,因为集合本来就可以存放多种数据类型,但是我以为只有名字,也就是字符串。

    ①在Collection集合中添加一个String类型的数据。

    ②在Collection集合中添加一个Integer类型的数据(18会自动转换成对应的引用数据类型)。

    ③现在我想统计群里人名都是多少字的,我以为只有字符串,就会将其强转成String并调用String的lenth方法。

    ④运行报错,因为有一个其他数据类型的数据混进来了,编译时期不能检测到,运行时会出现类转化异常。

    所以面对这种问题该怎么办呢?

    这种时候,就需要使用到泛型了。

    创建集合时先说清楚,只能存放String类型的数据,这时候若是有人捣乱存储其他类型的数据编译就会报错。

    等于是将运行时期会发生的异常提前到编译时期了

    所以泛型的作用是一种安全机制,是一种书写规范,它和接口的作用有着一定的类似,都是在制定规则。

    如何理解接口?

    接口里的抽象方法只有方法名,没有方法体,实现类必须重写该方法说明方法体。

    用现实里的一个例子说明就是:语文老师只给你一个题目,你要写一篇800字的作文。

    题目名就好比抽象方法,作文就好比实现类重写方法。

    所以接口就和作文题目一样是在制定规则。

    如何理解泛型?

    作文题材不限,记叙文、议论文、诗歌都可以。

    但是不能一篇作文既写成记叙文又写成议论文。

    一旦你确定了题材(比如说写议论文),那么这篇作文就不能写其他题材了(只能写议论文)想写其他题材,那下一篇作文重新写。

    所以什么叫泛型?

    就好比作文题材不限,但一次只能写一种题材,至于是什么题材,由我们自己定。

    所以本质上泛型它是一个变量,它是需要我们去赋值的。

    二、泛型的使用

    主要有泛型类、泛型接口、泛型方法以及泛型通配符。

    1泛型类

    非常常见的ArrayList类就是一个泛型类,看它的源码:

    ①泛型使用格式

    修饰符 class 类名<代表泛型的变量> { };

    ArrayList类中使用E来代表泛型的变量,E本身并没有含义,任意一个大写字母都可以,A、B、T、W都可以。

    ②泛型类的使用

    在创建对象的时候确定泛型,指定好了后这个对象就只能装指定的数据类型了。

    如果要换其他数据类型,就要重新创建该类的对象,重新指定泛型。泛型类有何好处?

    ③ArrayList的add方法

    add方法参数就是一个泛型,也就是说创建对象时确定的是哪个类型,使用add方法就只能添加这个类型了,这就起到了一个千变万化的效果。

    2泛型接口

    ①泛型接口格式

    修饰符 interface接口名<代表泛型的变量> { }

    这次我们自定义一个泛型接口,泛型为A。

    ②泛型类的使用一

    实现类实现接口、同时指定泛型类型。

    ③泛型类的使用二

    实现类实现接口但不指定泛型,这个类也就成了泛型类。

    ArrayList类本质上也就是这种情况,它实现了List<E>接口,但是没有指定泛型。

    3泛型方法

    ①泛型方法格式

    修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }

    ②泛型方法使用

    调用方法时,确定泛型的类型。

    4泛型通配符

    现有一个需求:封装一个方法,可以遍历参数为任意类型的ArrayList

    ①两个不同类型的集合

    一个集合泛型为String类,一个集合泛型为Integer:

    ArrayList<String>list1和ArrayList<Integer> list2是两个不同的类型,如果用常规方法,那要两个方法(方法重载)

    ②泛型的通配符

    不知道使用什么类型来接收的时候,此时可以使用??表示未知通配符。

    其中泛型通配符还可以这样使用:

    • <? extends Person>:表示可以传递Person及其子类
    • <? super Person>:表示可以传递Person及其父类

    注意:

    • 泛型不存在继承关系:ArrayList<Object>list并不是ArrayList<String>list1和ArrayList<Integer>list2的父类,它们三个是三个不同的类型。
    • 其中Java里的泛型是一种伪泛型。

    什么叫伪泛型?

    也就是泛型只存在于编译时期,在运行时期会被擦除,这个比较抽象不好说明,了解就好了。真泛型也是有的,但在Java语言里没有,C语言里有。

    总结:

    谢谢你的观看。

    如果可以的话,麻烦帮忙点个赞,谢谢你。

    暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。
  • 相关阅读:
    js中属性和方法的类型和区别
    深入理解js构造函数
    null和undefined区别(转)
    理解闭包 js回收机制
    php:判断 是否开启 SSL,CURL,ZIP,GD2,MYSQL,是否安装MEMCACHED
    php:封装了个时间函数,返回类似“1分钟前发布”,“5小时前发布”,“3年前发布”
    php:获取一个表不含text类型的全部字段
    php:两个文件夹递归地比较,没有的文件自动复制过去
    php:php相关的函数或用法记录
    js:常用到的js操作记录
  • 原文地址:https://www.cnblogs.com/zenghansen/p/15661361.html
Copyright © 2020-2023  润新知