本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~
Github地址
如果访问不了Github,可以访问gitee地址。
gitee地址
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
泛型带来的好处
在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一个安全隐患。
那么泛型的好处就是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的。- public class GlmapperGeneric<T> {
- private T t;
- public void set(T t) { this.t = t; }
- public T get() { return t; }
- public static void main(String[] args) {
- // do nothing
- }
- /**
- * 不指定类型
- */
- public void noSpecifyType(){
- GlmapperGeneric glmapperGeneric = new GlmapperGeneric();
- glmapperGeneric.set("test");
- // 需要强制类型转换
- String test = (String) glmapperGeneric.get();
- System.out.println(test);
- }
- /**
- * 指定类型
- */
- public void specifyType(){
- GlmapperGeneric<String> glmapperGeneric = new GlmapperGeneric();
- glmapperGeneric.set("test");
- // 不需要强制类型转换
- String test = glmapperGeneric.get();
- System.out.println(test);
- }
- }
复制代码 上面这段代码中的 specifyType 方法中 省去了强制转换,可以在编译时候检查类型安全,可以用在类,方法,接口上。
泛型中通配符
我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢?
常用的 T,E,K,V,?
本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行,但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。通常情况下,T,E,K,V,?是这样约定的:
- ?表示不确定的 java 类型
- T (type) 表示具体的一个java类型
- K V (key value) 分别代表java键值中的Key Value
- E (element) 代表Element
?无界通配符
先从一个小例子看起。最全面的Java面试网站
我有一个父类 Animal 和几个子类,如狗、猫等,现在我需要一个动物的列表,我的第一个想法是像这样的:但是老板的想法确实这样的:- List<? extends Animal> listAnimals
复制代码类型参数列表中如果有多个类型参数上限,用逗号分开
下界通配符 < ? super E>
下界: 用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object
在类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类。
[code]private void test(List |