图文详解 Java 泛型,写得太好了! (qq.com)
Java基础面试问题10个必须知道的问题 (qq.com)
问题引入在向集合中添加元素的过程中,Addd()方法中填充了Object类,而Object类是所有类别的父类,这导致了一个问题——添加的类型不能统一,这可能导致类型不统一,并在通历集合中取出元素时报告错误。
传统的方法不能限制添加到集合ArrayList中的数据类型。在遍历过程中,需要转换类型。如果集合中的数据量较大,类型转换将极大地影响程序的效率。
Java 泛型(Generics) 是 JDK 5 介绍的一个新特征。
泛型提供了编译过程中的类型安全检测机制,允许在编译过程中检测到非法类型。使用泛参数可以提高代码的可读性和稳定性。本质是参数类型。
- 类型像参数一样传递
- <数据类型>只能是引用类型,不能是int等基本数据类型
泛型:是一种不确定的数据类型。
利用泛型的好处常用的通配符有T、E、K、V,?
?java类型表示不确定
T type表示具体的java类型
K java键值中的keyy分别代表V、value
E element代表元素
1 省略强转代码,提高效率;
2 操作中的问题可以提前到编译期,编译时可以检查添加元素的类型,提高安全性。
不用泛型时用泛型时
追问:什么是泛型擦除?泛型是为javac编译器提供的,用于限制集合的输入类型,使编译器避免将非法数据插入到源代码级别的集合中。然而,在编译了具有泛型的java程序后,生成的class文件不再具有泛型信息,以免影响程序的运行效率。这个过程被称为擦除。
JVM不知道泛型的存在,因为泛型在编译阶段已经被处理成普通的类型和方法。处理机制是通过类型擦除和擦除规则:
- 没有具体类型的泛型,以Object为原始类型;
- 如果有限制类型< T exnteds XClass >,使用XClass作为原始类型;
- 若有多个限制< T exnteds XClass1 & XClass2 >,以第一边界类型XClass1为原始类型;
一般有三种使用方法:泛型、泛型接口、泛型方法。
1.泛型类:
///这里的T可以随意写成任何标志,如T、E、K、在实例化泛型类中,V等形式的参数通常用于表示泛型//,特定类型的public必须指定T class Generic<T>{ private T key; public Generic(T key) { this.key = key; } public T getKey(){ return key; }}
2.泛型接口:
public interface Generator<T> { public T method();}
3.泛型方法:
public static < E > void printArray( E[] inputArray ){ for ( E element : inputArray ){ System.out.printf( "%s ", element ); } System.out.println();}
问:泛型在项目中在哪里使用?- 自定义接口通用返回结果
CommonResult<T>
通过参数T
数据类型可以根据具体的返回类型动态指定结果 - 定义
Excel
处理类ExcelUtil<T>
用于动态指定Excel
导出的数据类型 - 集合工具建设参考(参考)
Collections
中的sort
,binarySearch
方法)