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 ...
随机推荐
- 【八股cover#4】OS Q&A与知识点
OS Q&A与知识点 重点知识 进程 概念 我们编译的代码可执行文件只是储存在硬盘的静态文件,运行时被加载到内存,CPU执行内存中指令,这个运行的程序被称为进程. 进程是对运行时程序的封装 ...
- 华为云峰会2024,GaussDB扬帆出海,给世界一个更优选择
本文分享自华为云社区<华为云峰会2024,GaussDB扬帆出海,给世界一个更优选择>,作者:GaussDB 数据库. 2024年2月26~29日,由GSM协会主办的"2024年 ...
- C#多线程(9):多阶段并行线程
目录 前言 Barrier 类 属性和方法 示例 新的示例 说明 前言 这一篇,我们将学习用于实现并行任务.使得多个线程有序同步完成多个阶段的任务. 应用场景主要是控制 N 个线程(可随时增加或减少执 ...
- 导入Excel文件的时候公式为【#Ref!】应该怎么解决?
前言 在我们使用Excel时,经常会遇到一个问题,就是导入Excel时公式显示为[#Ref!]的情况.这通常是因为公式中引用的单元格已被删除或对应的工作表被删除,导致原公式无法识别对应的参数而显示为[ ...
- spring重点后置处理器
1. DefaultListableBeanFactory的作用: 默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于bean definitio ...
- Lambda表达式(匿名函数)
C++11中引入了lambda表达式,定义匿名的内联函数. 我们可以直接原地定义函数而不用再跑到外面去定义函数跳来跳去. 同时在stl的排序上也有作用. [capture] (parameters) ...
- MySQL面经总结
MySQL日志 MySQL日志系统 MySQL查询 菜鸟教程SQL内连接 exist和in区别 sql语句优化 MySQL索引 覆盖索引 索引类型:主键索引,二级索引(辅助索引):唯一索引,普通索引, ...
- Atom安装插件的几种方式
界面安装 打开Atom->File->Settings->Install 输入你想要安装的插件名/Theme名 命令行安装 打开cmd命令行程序 切换到.atom/package目录 ...
- 网页上发起qq聊天
找到以前记录的小笔记,同步过来吧 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"& ...
- 静态类使用@Resource注解注入
工作中需要,简单记录一下 @Component public class AccountUtil { private static AccountIdDao accountIdDao; @Resour ...