JDK10的新特性:var泛型和多个接口实现
简介
在JDK10的新特性:本地变量类型var中我们讲到了为什么使用var和怎么使用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变量保留了四个接口的所有公共方法。
总结
本文介绍了泛型在多个接口实现中的具体例子,并使用var来精简代码。
本文的例子https://github.com/ddean2009/
learn-java-base-9-to-20
本文作者:flydean程序那些事
本文链接:www.flydean.com/jdk10-var-genericity-multiple-implements/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
JDK10的新特性:var泛型和多个接口实现的更多相关文章
- Java 8 新特性之泛型的类型推导
1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据 ...
- iOS9新特性之泛型
iOS9新特性之泛型 作用:限制类型 好处:1.提高开发规范,减少程序员之间的交流 2.通过集合取出来的对象,直接当作泛型对象使用,可以直接使用点语法(id类型不能使用点语法) 使用场景: 1.在集 ...
- java-API中的常用类,新特性之-泛型,高级For循环,可变参数
API中的常用类 System类System类包含一些有用的类字段和方法.它不能被实例化.属性和方法都是静态的. out,标准输出,默认打印在控制台上.通过和PrintStream打印流中的方法组合构 ...
- JDK5的新特性:泛型、可变参数、静态导入
数组可以在创建的时候就指定存放的数据类型,这样放入不同类型的时候就会发生编译错误. 而集合却可以存储多种不同类型,这样的话如果是遍历的时候在集合中装了好多不同的数据类型的时候,十分容易发生类型转换错误 ...
- JDK1.8新特性之(三)--函数式接口
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
- 新特性,推荐一款超强接口管理神器 Apifox
去年,在公众号给大家推荐了一款新面市不久的接口测试神器:Apifox,如果还未了解的读者,感兴趣的话可查阅原文:推荐一款技术人必备的接口测试神器:Apifox 为了照顾新进来的读者,且最近一年,Api ...
- JavaSE 学习笔记之新特性之泛型(二十)
泛型:jdk1.5版本以后出现的一个安全机制.表现格式:< > 好处: 1:将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题. ...
- Spring4学习回顾之路10-Spring4.x新特性:泛型依赖注入
泛型依赖注入:Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用. 话语太过抽象,直接看代码案例,依次建立如下代码: User.java package com.lql.sprin ...
- Spring新特性_泛型依赖注入
泛型依赖注入 package com.tanlei.spring.generic; import org.springframework.beans.factory.annotation.Autowi ...
- Java 8 新特性:3-函数(Function)接口
(原) 以前,在创建泛型时,是这么写的: List<String> list = new ArrayList<String>(); 现在,可以这么写了: List<Str ...
随机推荐
- FFmpeg开发笔记(七):ffmpeg解码音频保存为PCM并使用软件播放
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 问题解决:由于找不到msvcr110.dll,无法继续执行代码
报错 解决 下载地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=30679
- vue 前端自动打开文件地址进行下载
最近在做异步导出的功能,导出的过程中前端另外启动一个查询导出进度的线程接口.如果导出完成后,把生成的文件上传到服务器,返回给前端一个文件的下载地址:前端自动打开这个地址进行跳转下载. 有两种方式 1. ...
- Java面向对象之内部类的几类使用场景
介绍 Java内部类是一种特殊的类,它定义在另一个类的内部.内部类提供了许多有用的特性,包括访问外部类的私有成员.隐藏实现细节以及实现回调接口等.以下是Java内部类的一些常用场景及其举例说明: 回调 ...
- DataGear 制作基于 three.js 的 3D 数据可视化看板
DataGear专业版 1.0.0 已发布,欢迎试用! http://datagear.tech/pro/ DataGear 支持采用原生的HTML.JavaScript.CSS制作数据可视化看板,也 ...
- 【Azure 环境】当在Azure 环境中调用外部接口不通时,如何定位SSL Certificate Problem
问题描述 如果在Azure VM中,发现同一个API,一台VM可以访问成功,另外一台访问失败.如何来调试并定位问题呢? 问题分析 第一步,查看访问外部API不通时候出现什么错误.如果没有明确的错误消息 ...
- linux网络编程基础知识汇总(更新中)
阿帕网 arpanet 阿帕网为美国国防部高级研究计划署开发的世界上第一个运营的封包交换网络,它是全球互联网的始祖. 局域网 LAN(Local Area Network ):通过路由器和交换机把计算 ...
- 这波操作看麻了!十亿行数据,从71s到1.7s的优化之路。
你好呀,我是歪歪. 春节期间关注到了一个关于 Java 方面的比赛,很有意思.由于是开源的,我把项目拉下来试图学(白)习(嫖)别人的做题思路,在这期间一度让我产生了一个自我怀疑: 他们写的 Java ...
- Java 关于变量的赋值
1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...
- 私有网盘服务 dzzoffice部署
官网地址: https://dzzoffice.com/ dzzoffice有多种部署方式, docker方式,源码方式, 经过测试,这两种部署方式在数据进行备份恢复时都会存在一些bug, 所有这里采 ...