zoukankan      html  css  js  c++  java
  • 如何实现JDK10的新特性:var泛型和多个接口,案例详解

     

    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架构项目实战教程及大厂面试题库,进我扣裙 :七吧伞吧零而衣零伞 (数字的谐音)转换下可以找到了,还可以跟老架构师交流

    本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

  • 相关阅读:
    Struts类型转换
    Oracle的学习,知识点整理
    常用的Oracle_SQL语句
    Oracle的优化
    Oracle创建表空间,用户,授权
    Linux权限的控制
    Oracle实例的3种连接方式和所使用的连接工具
    Oracle数据库打开端口
    Hibernate一对多配置
    hibernate UUID问题
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12909110.html
Copyright © 2011-2022 走看看