泛型的介绍
java5之前的集合没有泛型这一概念,相当于List,之所以这样设计,是为了通用性,使得集合当中可以放入各种各样的类型,但这样做带来如下两个问题:
- 集合可以放入任意的数据类型,当想使用一个保存Dog实体类的集合时,却能轻易的将Cat实体类也“丢进去”,可以会引发异常。
- 由于把对象“丢进”集合时,集合丢失了对象的状态信息,只知道它盛装的是Object,因此取出集合元素后通常还需要进行强制类型转换。这种强制类型转换既增加了编程的复杂度,也可能引发ClassCastException异常。
所以Java5之后就推出了泛型,在new集合的时候就可以指定集合的类型,例如List 就只能放入Integer类型。
所以这里体现出泛型的好处:
集合当中不能随意放入任意数据类型,只能放入指定的数据类型,提高了程序的简洁性。
集合会记住其中的数据类型,取出来的时候减少了一个数据类型的转化操作
泛型擦除和泛型转化
泛型擦除:
当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有在尖括号之间的类型信息都将被扔掉,比如
List<String> list1 = ...; List list2 = list1; // list2将元素当做Object处理
泛型转化:
直接把一个List对象赋给一个List对象应该引起编译错误,但实际上不会。对泛型而言,可以直接把一个List对象赋给一个 List 对象,编译器仅仅提示“未经检查的转换”。
List list1 = ...; List<String> list2 = list1; // 编译时警告“未经检查的转换”
List<? super T>和List<? extends T>有什么区别?
? 是类型通配符,List<?> 可以表示各种泛型List的父类,意思是元素类型未知的List;
List<? super T> 用于设定类型通配符的下限,此处 ? 代表一个未知的类型,但它必须是T的父类型;
List<? extends T> 用于设定类型通配符的上限,此处 ? 代表一个未知的类型,但它必须是T的子类型。
mybatis-plus 当中的代码生成器生成的service层代码就使用了
生成的service


版权声明:本文为weixin_43412919原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。