一、泛型
关于泛型的概念,请参考博客:https://www.cnblogs.com/MrZhang1/p/7261232.html
举个例子:人类在不断向文明进化的过程中,创造了洗手间,本意是让大家文明生活。但有一天,当男人和女人同时进了一个洗手间,不好的事情就发生了。。恩。。呃。。,各位自行想象。本来建个洗手间是方便大家生活的,结果还制造了更大的麻烦。肿么办?!
建两个洗手间:男洗手间和女洗手间;规定,男人只能进男洗手间,女人只能进女洗手间。
泛型也经过了一个这样演化的过程:“ 从Java 5开始,引入了参数化类型(Parameterized Type)的概念,改造了所有的Java集合,使之都实现泛型,允许程序在创建集合时就可以指定集合元素的类型,比如List<String>就表名这是一个只能存放String类型的List”
二、语法和使用
1、使用具体的泛型类型: 尖括号内带有具体的类型。
List<String> strList = new ArrayList<>();
2、方法声明的时候:public <T> T getValue(){...}
比如我们常用的Web项目中,泛型是修饰类型的,在方法上,一般就是返回值和参数列表
返回值类型:可以定义为List<String>等形式,但是实际开发中,一般都是不知道具体类型,定义形式如下 <T> List<T> test(T t){...} ,前边的<T>可以理解为泛型的声明,只有声明了T,你才可以在方法中用到T,这一具体的类型, List<T>是具体的返回值类型。
方法传参:可以用占位符限定的容器 比如 List<T>,或者直接是占位符 T。
比如我们在使用工具类时,有将json转化为对象,我们可能将json转化为各种类型的对象,为了提高代码的复用性,我们使用工具类,将json转为T对象,到具体业务中再强转;
/** * 将json结果集转化为对象 * * @param jsonData json数据 * @param beanType 对象中的object类型 * @return */ public static <T> T jsonToPojo(String jsonData, Class<T> beanType) throws IOException { T t; try { t = OBJECT_MAPPER.readValue(jsonData, beanType); } catch (IOException e) { throw e; } return t; }
3、类或者接口使用泛型 interface Collection<V> {..}
在真正的项目上,一些基础的公共类经常定义泛型,如下:
public interface GenericDao<T, ID extends Serializable> { public abstract void saveOrUpdate(T t) throws DataAccessException; // 更新操作 public abstract T get(ID id) throws DataAccessException; //查询方法 }
三、注意
Java会在编辑期把泛型擦除掉,在JAVA的虚拟机中并不存在泛型,泛型只是为了完善java体系,增加程序员编程的便捷性以及安全性而创建的一种机制,在JAVA虚拟机中对应泛型的都是确定的类型,在编写泛型代码后,java虚拟中会把这些泛型参数类型都擦除,用相应的确定类型来代替,代替的这一动作叫做类型擦除,而用于替代的类型称为原始类型,在类型擦除过程中,一般使用第一个限定的类型来替换,若无限定,则使用Object。
关于泛型的知识还有很多,小编就不在这里一一讲解了。
参考博客:https://www.cnblogs.com/ldh-better/p/7127308.html#_label1