java 泛型(generics)使用总结

java泛型,总是朦朦胧胧的,会用,但又总是口数不清起用途,下文结合文章以及部分源码简述自己的理解。
简单理解泛型,就是参数化参数。大部分时候我们的方法都是指定了入参类型的,有时候为了这个接口更加通用,可能就涉及到泛型的使用,将这些个参数抽象化,不限定其为具体的某一种类型。另外,通过参数的泛型华,往往在其实现部分,需要结合反射实现更加通用的逻辑。
下面看一下泛型比较学术的作用描述

在这里插入图片描述

第一点,我理解应该是指发兼容性,比如我用一个list,不指定它的类型,这样我是可以添加任何类型的数据进入到容器中的,在从容器中取出数据后,再通过数据的类型去判断该走怎样的逻辑。但似乎一般不这么用。
第二点,就比较好理解了,比如这里的list我限定其只能添加String类型的数据,那么在添加其它类型数据时,编译器就会直接报错了。便于数据统一,编译阶段数据校验。
第三点,根据他举的例子比较好理解,复制对象属性的时候,为了适配更多的类型,可以采用泛型。BeanUtils的copyProperties方法采用的是Object类来适配,毕竟都是Object的子类。有时候有些方法可能需要传入Class类,这些情况可以酌情用泛型来进行代替。

泛型的分类:
泛型接口 泛型类 泛型方法

在这里插入图片描述
MybatisPlus的BaseMapper为泛型接口,所有所有本地的mapper接口都继承了这个BaseMaper泛型接口,对应泛型为对应的bean,所以我们调用默认的insert方法时,限定其入参均为指定的bean实例。

在这里插入图片描述
上图的ArrayList为一个泛型类,大家用的都比较多,多数情况下我们可以指定容器存储的数据类型,编译阶段即可验证数据的类型,不用再强制类型转换,数据安全。

在这里插入图片描述
接口和类的泛型都是跟在名后,方法的泛型在修饰符后,返回类型前。上图test方法和test01方法功效一致,test02限定了其入参为所有String的子类,其中也包含String类型本身。
test02称之为有界泛型,三个重要的关键字为? 、extends和supper。?表示通配符类型,用于表达任意类型,需要注意的是,它指代的是“某一个任意类型”,但并不是Object。extends在泛型里不是继承,而是定义上界的意思。super关键字用于定义泛型的下界。例如T super String,String为泛型T的下界,也就是说,T必须为String或者它的父类,与extends刚好相反。

猜你喜欢

转载自blog.csdn.net/qq_41885819/article/details/120484997