美文网首页Java程序那些事
JDK10的新特性:var泛型和多个接口实现

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

作者: flydean程序那些事 | 来源:发表于2020-05-18 06:51 被阅读0次

简介

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泛型和多个接口实现

    简介 在JDK10的新特性:本地变量类型var中我们讲到了为什么使用var和怎么使用var。 今天我们来深入的考虑...

  • Java泛型详细分析

    什么是泛型 Java泛型( generics) 是JDK 5中引⼊的⼀个新特性, 允许在定义类和接口的时候使⽤类型...

  • 泛型

    泛型 Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(ty...

  • 泛型

    23,请不要在新代码中使用原生态类型 声明中具有一个或多个类型参数的类或接口,就是泛型类或者接口。泛型类和接口统称...

  • Java泛型解析(太过精辟)

    泛型概述 Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(t...

  • flow中文文档(七)

    接口类型 接口语法 接口泛型 接口属性变量(只读和只写) 通用类型 泛型特性 接口类型 Flow中的类名义上是键入...

  • Java 泛型

    本文只是做为泛型的入门和基础的泛型的了解。 什么是泛型?泛型(generices)是JDK5引入的新特性,这个特性...

  • Java泛型详解

    2.6 Java泛型详解 Java泛型是JDK5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type...

  • Java学习之泛型

    一、泛型概述 --->JDK1.5新特性 1、泛型的出现: 1、泛型是在JDK1.5以后出现的新特性。泛型是用于解...

  • 漫谈Java的泛型机制

    泛型是Java 1.5引入的新特性。泛型的本质是参数化类型,这种参数类型可以用在类、变量、接口和方法的创建中,分别...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/fesyohtx.html