JDK10新特性之var泛型和多個(gè)接口實(shí)現(xiàn)方法
簡介
在JDK10的新特性:本地變量類型var中我們講到了為什么使用var和怎么使用var。
今天我們來深入的考慮一下var和泛型,多個(gè)接口實(shí)現(xiàn)的問題。
實(shí)現(xiàn)多個(gè)接口
在JDK的實(shí)現(xiàn)和我們?nèi)粘5墓ぷ髦?,很多時(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è)接口。
如果我們有一個(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來替代要返回的對(duì)象。
如果返回了Object就沒有了泛型帶來的優(yōu)勢(shì),有沒有什么方法讓我們清楚的知道要返回的對(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在你自己的代碼中使用是沒有問題的,考慮一下,如果你的代碼被別人引用,或者作為一個(gè)公共庫來被別人使用,第三方可能根本就不知道你的新創(chuàng)建的ListInterface到底是做什么的。
我們能不能使用一種更加直觀的方法來創(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變量來替代了,我們看下下面的例子:
public void useVarInGenericityType(){ VarGenericity varGenericity=new VarGenericity(); var list=varGenericity.createListWithInterfaceT(true); }
是不是很簡單,并且var list變量保留了四個(gè)接口的所有公共方法。
總結(jié)
本文介紹了泛型在多個(gè)接口實(shí)現(xiàn)中的具體例子,并使用var來精簡代碼。
本文的例子[ https://github.com/ddean2009/
learn-java-base-9-to-20](https://github.com/ddean2009/ ...
到此這篇關(guān)于JDK10新特性之var泛型和多個(gè)接口實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)JDK10 var泛型和多個(gè)接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java接口返回參數(shù)按照請(qǐng)求參數(shù)進(jìn)行排序方式
這篇文章主要介紹了java接口返回參數(shù)按照請(qǐng)求參數(shù)進(jìn)行排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09MyBatis實(shí)現(xiàn)字段加解密的實(shí)踐
為了數(shù)據(jù)安全問題,有時(shí)候需要將部分敏感字段加密后再入庫,本文主要介紹了MyBatis實(shí)現(xiàn)字段加解密的實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報(bào)錯(cuò):Not allowed to load local
這篇文章主要介紹了基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報(bào)錯(cuò):Not allowed to load local resource),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Spring?Security認(rèn)證器實(shí)現(xiàn)過程詳解
一些權(quán)限框架一般都包含認(rèn)證器和決策器,前者處理登陸驗(yàn)證,后者處理訪問資源的控制,這篇文章主要介紹了Spring?Security認(rèn)證器實(shí)現(xiàn)過程,需要的朋友可以參考下2022-06-06MyBatis學(xué)習(xí)筆記(二)之關(guān)聯(lián)關(guān)系
這篇文章主要介紹了MyBatis學(xué)習(xí)筆記(二)之關(guān)聯(lián)關(guān)系 的相關(guān)資料,需要的朋友可以參考下2016-02-02Java 17 更新后的 strictfp 關(guān)鍵字
strictfp 可能是最沒有存在感的關(guān)鍵字了,很多人寫了多年 Java 甚至都不知道它的存在,strictfp,字面意思就是嚴(yán)格的浮點(diǎn)型。這玩意兒居然還有個(gè)關(guān)鍵字,可見其地位還是很高的。下面文章小編就帶大家詳細(xì)介紹其關(guān)鍵字,需要的朋友可以參考一下2021-09-09mybatis實(shí)現(xiàn)讀取樹結(jié)構(gòu)數(shù)據(jù)實(shí)例代碼
這篇文章主要介紹了mybatis實(shí)現(xiàn)讀取樹結(jié)構(gòu)數(shù)據(jù)實(shí)例代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09java統(tǒng)計(jì)字符串中指定元素出現(xiàn)次數(shù)方法
這篇文章主要介紹了java統(tǒng)計(jì)字符串中指定元素出現(xiàn)次數(shù)方法,需要的朋友可以參考下2015-12-12