这篇文章主要讲解了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这四个接口。
如果我们有一个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变量保留了四个接口的所有公共方法。
看完上述内容,是不是对JDK10中如何实现var泛型和多个接口有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。