如何实现JDK10的新特性:var泛型和多个接口,案例详解
今天我们来深入的考虑一下var和泛型,多个接口实现的问题。
实现多个接口
在JDK的实现和我们日常的工作中,很多时候都需要实现多个接口,我们举常用的两个例子ArrayList和CopyOnWriteArrayList。先看下他们的定义:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class CopyOnWriteArrayList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
我们可以看到ArrayList和CopyOnWriteArrayList都实现了List,RandomAccess,Cloneable,Serializable这四个接口。
更多内容请访问www.flydean.com
如果我们有一个ArrayList creater,可以创建ArrayList或者CopyOnWriteArrayList中的一个,那么代码应该怎么写呢?
public Object createList(boolean flag){
if(flag){
return new ArrayList<>();
}else{
return new CopyOnWriteArrayList<>();
}
}
因为返回的值可能是ArrayList也可能是CopyOnWriteArrayList,我们只能以Object来替代要返回的对象。
如果返回了Object就没有了泛型带来的优势,有没有什么方法让我们清楚的知道要返回的对象到底是什么类型的呢?
大家第一个想到的可能就是创建一个新的接口,继承List, RandomAccess, Cloneable, java.io.Serializable,然后createList返回该新创建的接口即可。
public interface ListInterface<E> extends List<E>, RandomAccess, Cloneable, java.io.Serializable {
}
然后把createList方法改写:
public <E> ListInterface<E> createListWithInterface(boolean flag){
if(flag){
return (ListInterface<E>) new ArrayList<E>();
}else{
return (ListInterface<E>) new CopyOnWriteArrayList<E>();
}
}
新的方法可以带泛型,并且明确的表明了要返回的是一个ListInterface。
新生成的ListInterface在你自己的代码中使用是没有问题的,考虑一下,如果你的代码被别人引用,或者作为一个公共库来被别人使用,第三方可能根本就不知道你的新创建的ListInterface到底是做什么的。
我们能不能使用一种更加直观的方法来创建List呢?答案当然是可以的,看下面的例子:
public <T extends List<E> & RandomAccess & Cloneable & java.io.Serializable, E> T createListWithInterfaceT(boolean flag){
if(flag){
return (T) new ArrayList<E>();
}else{
return (T) new CopyOnWriteArrayList<E>();
}
}
上面的例子中,我们使用了泛型T同时继承了4个接口。然后将创建的List转换成T返回。
这样我们即得到了ArrayList和CopyOnWriteArrayList的公共类型,也不需要创建新的接口。
使用多个接口
上面我们创建了一个实现多个接口的泛型T。那么如果要使用它该怎么做呢?
public <T extends List<E> & RandomAccess & Cloneable & java.io.Serializable, E> void useGenericityType(){
VarGenericity varGenericity=new VarGenericity();
T list=varGenericity.createListWithInterfaceT(true);
}
为了在方法内部使用T,我们必须在方法定义上面再重新申明一次T的定义。
这么做虽然可以实现我们的功能,但是实在是太麻烦了。
使用var
这个时候就可以使用var变量来替代了,我们看下下面的例子:
public void useVarInGenericityType(){
VarGenericity varGenericity=new VarGenericity();
var list=varGenericity.createListWithInterfaceT(true);
}
是不是很简单,并且var list变量保留了四个接口的所有公共方法。最后注意:光理论是不够的。在此顺便送大家十套2020最新JAVA架构项目实战教程及大厂面试题库,进我扣裙 :七吧伞吧零而衣零伞 (数字的谐音)转换下可以找到了,还可以跟老架构师交流
本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理
原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12909110.html
- Flash/Flex学习笔记(29):MovieClip帧/时间轴的控制
- Oracle日常运维操作总结-数据库的启动和关闭
- Python中Json解析的坑
- Flash/Flex学习笔记(28):动态文本的滚动控制
- CentOS7下Elasticsearch集群部署记录
- Flash/Flex学习笔记(27):摄像头/麦克风的视频/音量指示器
- Flash/Flex学习笔记(26):AS3自定义右键菜单
- Python27中Json对中文的处理
- Python在VSCode中进入交互界面调试
- CentOS7下单机部署RabbltMQ环境的操作记录
- Flash/Flex学习笔记(24):粒子效果
- 针对业务日志的监控报警设置
- 对广晟有色的数据分析
- Flash/Flex学习笔记(22):滤镜学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mac安装brew 及安装报错的解决办法【已解决】
- 为什么要停止过度使用置换重要性来寻找特征
- 5个可以帮助pandas进行数据预处理的可视化图表
- 聊聊dubbo-go的leastActiveLoadBalance
- 聊聊dubbo-go的randomLoadBalance
- 聊聊dubbo-go的roundRobinLoadBalance
- PowerBI 不同日期区间的活动逐日对比分析
- flask SQLAlchemy查询数据库最近30天,一个月,一周,12小时或之前的数据
- TypeScript是什么,为什么要使用它?
- Python 基础(十):模块与包
- 谷歌浏览器一些https打不开点击高级不行的解决办法
- CV入门赛最全思路&上分技巧汇总!
- VBA专题10-5:使用VBA操控Excel界面之隐藏/取消隐藏及最小化功能区
- 从一道面试题说起:GET 请求能传图片吗?
- ModuleNotFoundError: No module named ‘pip‘【已解决】