JDK10的新特性:var泛型和多个接口实现

简介: 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来精简代码。


相关文章
|
22天前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
39 7
|
2月前
|
Java Go Scala
jdk10的var局部变量类型推理
本文介绍了JDK 10中引入的局部变量类型推断功能,即`var`关键字,它允许开发者在声明具有初始值的局部变量时省略显式类型,以简化代码并提高可读性。
15 1
jdk10的var局部变量类型推理
|
3月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
49 3
|
2月前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
29 0
|
3月前
|
编解码 安全 Java
jdk8新特性-接口和日期处理
jdk8新特性-接口和日期处理
|
4月前
|
Java API
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
|
4月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
4月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
3月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
18 0
|
4月前
|
算法 Java iOS开发
JDK8到JDK27版本升级的新特性问题之JDK 17中G1在资源占用方面有何变化
JDK8到JDK27版本升级的新特性问题之JDK 17中G1在资源占用方面有何变化