在JDK10的新特性:本地變量類型var中咱們講到了爲何使用var和怎麼使用var。java
今天咱們來深刻的考慮一下var和泛型,多個接口實現的問題。git
在JDK的實現和咱們平常的工做中,不少時候都須要實現多個接口,咱們舉經常使用的兩個例子ArrayList和CopyOnWriteArrayList。先看下他們的定義:github
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這四個接口。dom
更多內容請訪問 www.flydean.com
若是咱們有一個ArrayList creater,能夠建立ArrayList或者CopyOnWriteArrayList中的一個,那麼代碼應該怎麼寫呢?code
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方法改寫:ip
public <E> ListInterface<E> createListWithInterface(boolean flag){ if(flag){ return (ListInterface<E>) new ArrayList<E>(); }else{ return (ListInterface<E>) new CopyOnWriteArrayList<E>(); } }
新的方法能夠帶泛型,而且明確的代表了要返回的是一個ListInterface。ci
新生成的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變量來替代了,咱們看下下面的例子:
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](https://github.com/ddean2009/...
本文做者:flydean程序那些事本文連接:www.flydean.com/jdk10-var-genericity-multiple-implements/
本文來源:flydean的博客
歡迎關注個人公衆號:程序那些事,更多精彩等着您!