
今天我們來深入的考慮一下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這四個介面,
更多內容請訪問www.flydean.com
如果我們有一個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變數保留了四個介面的所有公共方法,最后注意:光理論是不夠的,在此順便送大家十套2020最新JAVA架構專案實戰教程及大廠面試題庫,進我扣裙 :七吧傘吧零而衣零傘 (數字的諧音)轉換下可以找到了,還可以跟老架構師交流
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/190339.html
標籤:Java
上一篇:re模塊常用方法
