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>,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,java.io.Serializable,然後createList返回該新建立的介面即可。
public interface ListInterface<E> extends List<E>,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](https://github.com/ddean2009/ ...
到此這篇關於JDK10新特性之var泛型和多個介面實現方法的文章就介紹到這了,更多相關JDK10 var泛型和多個介面內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!