溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JDK10中如何實(shí)現(xiàn)var泛型和多個(gè)接口

發(fā)布時(shí)間:2020-07-23 16:41:15 來源:億速云 閱讀:132 作者:小豬 欄目:編程語言

這篇文章主要講解了JDK10中如何實(shí)現(xiàn)var泛型和多個(gè)接口,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

簡(jiǎ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);
 }

是不是很簡(jiǎn)單,并且var list變量保留了四個(gè)接口的所有公共方法。

看完上述內(nèi)容,是不是對(duì)JDK10中如何實(shí)現(xiàn)var泛型和多個(gè)接口有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI