JDK10的新特性:var泛型和多个接口实现
文章目錄
- 簡(jiǎn)介
- 實(shí)現(xiàn)多個(gè)接口
- 使用多個(gè)接口
- 使用var
- 總結(jié)
簡(jiǎn)介
在JDK10的新特性:本地變量類型var中我們講到了為什么使用var和怎么使用var。
今天我們來(lái)深入的考慮一下var和泛型,多個(gè)接口實(shí)現(xiàn)的問(wèn)題。
實(shí)現(xiàn)多個(gè)接口
在JDK的實(shí)現(xiàn)和我們?nèi)粘5墓ぷ髦?#xff0c;很多時(shí)候都需要實(shí)現(xiàn)多個(gè)接口,我們舉常用的兩個(gè)例子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都實(shí)現(xiàn)了List,RandomAccess,Cloneable,Serializable這四個(gè)接口。
更多內(nèi)容請(qǐng)?jiān)L問(wèn)www.flydean.com
如果我們有一個(gè)ArrayList creater,可以創(chuàng)建ArrayList或者CopyOnWriteArrayList中的一個(gè),那么代碼應(yīng)該怎么寫呢?
public Object createList(boolean flag){if(flag){return new ArrayList<>();}else{return new CopyOnWriteArrayList<>();}}因?yàn)榉祷氐闹悼赡苁茿rrayList也可能是CopyOnWriteArrayList,我們只能以O(shè)bject來(lái)替代要返回的對(duì)象。
如果返回了Object就沒(méi)有了泛型帶來(lái)的優(yōu)勢(shì),有沒(méi)有什么方法讓我們清楚的知道要返回的對(duì)象到底是什么類型的呢?
大家第一個(gè)想到的可能就是創(chuàng)建一個(gè)新的接口,繼承List, RandomAccess, Cloneable, java.io.Serializable,然后createList返回該新創(chuàng)建的接口即可。
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>();}}新的方法可以帶泛型,并且明確的表明了要返回的是一個(gè)ListInterface。
新生成的ListInterface在你自己的代碼中使用是沒(méi)有問(wèn)題的,考慮一下,如果你的代碼被別人引用,或者作為一個(gè)公共庫(kù)來(lái)被別人使用,第三方可能根本就不知道你的新創(chuàng)建的ListInterface到底是做什么的。
我們能不能使用一種更加直觀的方法來(lái)創(chuàng)建List呢?答案當(dāng)然是可以的,看下面的例子:
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同時(shí)繼承了4個(gè)接口。然后將創(chuàng)建的List轉(zhuǎn)換成T返回。
這樣我們即得到了ArrayList和CopyOnWriteArrayList的公共類型,也不需要?jiǎng)?chuàng)建新的接口。
使用多個(gè)接口
上面我們創(chuàng)建了一個(gè)實(shí)現(xiàn)多個(gè)接口的泛型T。那么如果要使用它該怎么做呢?
public <T extends List<E> & RandomAccess & Cloneable & java.io.Serializable, E> void useGenericityType(){VarGenericity varGenericity=new VarGenericity();T list=varGenericity.createListWithInterfaceT(true);}為了在方法內(nèi)部使用T,我們必須在方法定義上面再重新申明一次T的定義。
這么做雖然可以實(shí)現(xiàn)我們的功能,但是實(shí)在是太麻煩了。
使用var
這個(gè)時(shí)候就可以使用var變量來(lái)替代了,我們看下下面的例子:
public void useVarInGenericityType(){VarGenericity varGenericity=new VarGenericity();var list=varGenericity.createListWithInterfaceT(true);}是不是很簡(jiǎn)單,并且var list變量保留了四個(gè)接口的所有公共方法。
總結(jié)
本文介紹了泛型在多個(gè)接口實(shí)現(xiàn)中的具體例子,并使用var來(lái)精簡(jiǎn)代碼。
本文的例子https://github.com/ddean2009/
learn-java-base-9-to-20
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級(jí)賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無(wú)到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對(duì)Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程
本文作者:flydean程序那些事
本文鏈接:www.flydean.com/jdk10-var-genericity-multiple-implements/
本文來(lái)源:flydean的博客
歡迎關(guān)注我的公眾號(hào):程序那些事,更多精彩等著您!
總結(jié)
以上是生活随笔為你收集整理的JDK10的新特性:var泛型和多个接口实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JDK10的新特性:本地变量类型var
- 下一篇: 小师妹学JavaIO之:File文件系统