重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要为大家展示了“java中使用泛型屏蔽类型的差异性是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中使用泛型屏蔽类型的差异性是什么”这篇文章吧。
创新互联建站拥有网站维护技术和项目管理团队,建立的售前、实施和售后服务体系,为客户提供定制化的成都网站设计、网站制作、网站维护、西部信息服务器托管解决方案。为客户网站安全和日常运维提供整体管家式外包优质服务。我们的网站维护服务覆盖集团企业、上市公司、外企网站、电子商务商城网站建设、政府网站等各类型客户群体,为全球上1000+企业提供全方位网站维护、服务器维护解决方案。
在C++语言中,有个很好用的模板(template)功能,可以编写带有参数化类型的通用版本,让编译器自动生成针对不同类型的具体版本。而在Java语言中,也有一个类似的功能叫泛型(generic)。在编写类和方法的时候,一般使用的是具体的类型,而用泛型可以使类型参数化,这样就可以编写更通用的代码。
许多人都认为,C++模板(template)和Java泛型(generic)两个概念是等价的,其实实现机制是完全不同的。C++模板是一套宏指令集,编译器会针对每一种类型创建一份模板代码副本;Java泛型的实现基于"类型擦除"概念,本质上是一种进行类型限制的语法糖。
以支撑类为例,定义泛型的通用支撑类:
/** 通用支撑类 */@Getter@Setter@ToStringpublic class GenericHolder{ /** 通用取值 */ private T value; /** 构造函数 */ public GenericHolder() {} /** 构造函数 */ public GenericHolder(T value) { this.value = value; } }
定义泛型的数据提供者接口:
/** 数据提供者接口 */public interface DataProvider{ /** 获取数据函数 */ public T getData(); }
定义泛型的浅拷贝函数:
/** 浅拷贝函数 */public staticT shallowCopy(Object source, Class clazz) throws BeansException { // 判断源对象 if (Objects.isNull(source)) { return null; } // 新建目标对象 T target; try { target = clazz.newInstance(); } catch (Exception e) { throw new BeansException("新建类实例异常", e); } // 拷贝对象属性 BeanUtils.copyProperties(source, target); // 返回目标对象 return target; }
泛型通配符一般是使用"?"代替具体的类型实参,可以把"?"看成所有类型的父类。当具体类型不确定的时候,可以使用泛型通配符 "?";当不需要使用类型的具体功能,只使用Object类中的功能时,可以使用泛型通配符 "?"。
/** 打印取值函数 */public static void printValue(GenericHolder> holder) { System.out.println(holder.getValue()); }/** 主函数 */public static void main(String[] args) { printValue(new GenericHolder<>(12345)); printValue(new GenericHolder<>("abcde")); }
在Java规范中,不建议使用泛型通配符"?",上面函数可以改为:
/** 打印取值函数 */public staticvoid printValue(GenericHolder holder) { System.out.println(holder.getValue()); }
在使用泛型的时候,我们还可以为传入的泛型类型实参进行上下界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类。泛型上下界的声明,必须与泛型的声明放在一起 。
上界通配符(extends):
上界通配符为”extends”,可以接受其指定类型或其子类作为泛参。其还有一种特殊的形式,可以指定其不仅要是指定类型的子类,而且还要实现某些接口。例如:List extends A>表明这是A某个具体子类的List,保存的对象必须是A或A的子类。对于List extends A>列表,不能添加A或A的子类对象,只能获取A的对象。
下界通配符(super):
下界通配符为”super”,可以接受其指定类型或其父类作为泛参。例如:List super A>表明这是A某个具体父类的List,保存的对象必须是A或A的超类。对于List super A>列表,能够添加A或A的子类对象,但只能获取Object的对象。
PECS(Producer Extends Consumer Super)原则:
作为生产者提供数据(往外读取)时,适合用上界通配符(extends);
作为消费者消费数据(往里写入)时,适合用下界通配符(super)。
在日常编码中,比较常用的是上界通配符(extends),用于限定泛型类型的父类。例子代码如下:
/** 数字支撑类 */@Getter@Setter@ToStringpublic class NumberHolder{ /** 通用取值 */ private T value; /** 构造函数 */ public NumberHolder() {} /** 构造函数 */ public NumberHolder(T value) { this.value = value; } }/** 打印取值函数 */public static void printValue(GenericHolder holder) { System.out.println(holder.getValue()); }
以上是“java中使用泛型屏蔽类型的差异性是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!