2010-10-13 13 views
1

我想創建一個抽象數組方法,它指定數組的這個抽象對象只能容納3個項目。java中設置長度數組的抽象方法?

現在我已經嘗試做這樣的事情public abstract BaseAdapter[3] adapters();,但它抱怨一個錯誤,它不能這樣做。

是他們的另一種方式,還是我需要做public abstract BaseAdapter[] adapters();

,將工作正常,但子類仍然可以傳遞一個數組比3項

+0

你的問題不清楚。你想創建一個班級還是一個方法?請編輯你的問題。 – sleske 2010-10-13 10:51:53

+0

返回類型不是方法簽名的一部分,這意味着您不能強制超類中的特定返回類型。 – 2010-10-13 12:32:53

回答

5

你可以解決這個問題是這樣的:

  • 創建一個抽象的輔助方法(你可以重寫)返回類型爲BaseAdapter[]

    protected abstract BaseAdapter[] createAdapters(); 
    
  • 命名createAdapters()在你有你的超一流a 最後的方法adapters做以下事情:

    public final BaseAdapter[] adapters() { 
        BaseAdapter[] adapters = createAdapters(); 
        if (adapters.length != 3) 
         throw new Exception("Error: Please return 3 adapters."); 
        return adapters; 
    } 
    

另一種方法是創建包含三個BaseAdapters稱爲BaseAdapterTriple(或許還有一個更描述性的名稱)的簡單類,並使用它作爲返回值。

+1

那麼請聲明方法爲最後:) – pgras 2010-10-13 11:28:05

+0

啊,謝謝,修正了 – aioobe 2010-10-13 12:33:58

1

據我所知,沒有辦法在方法簽名中的對象上設置限制。在實現方法中使用異常,或使用自定義類。

0

不,你不能用數組和列表來做到這一點。如果數量超過3,則可以拋出異常並記錄此行爲。

0

如果你想要一個adapters()方法,它最多隻能和有子類返回3 BaseAdapter實施「迴歸」本身,同時尊重3max合同,你應該做的驗證在你adapters()方法,並調用一個abstract方法。

例如:

abstract class YourAbstractClass{ 
    public BaseAdapter[] adapters(){ 
     BaseAdapter[] adapters = internalAdapters(); 
     if(adapters.length > 3){ 
      throw new IllegalStateException(); 
     } 
     return adapters; 
    } 

    protected abstract BaseAdapter[] internalAdapters(); 
} 
0

aioobe's answer是採取一個好辦法,但我也建議的東西有點不同:

如果您需要一個方法返回的數組一定的大小,您可能想首先考慮爲什麼數組是適合此方法的返回類型,而不是使用可輕鬆封裝「3 BaseAdapters」的簡單POJO,即:

public class ThreeAdapters { 
    BaseAdapter getAdapter1() { ...} 
    BaseAdapter getAdapter2() { ...} 
    BaseAdapter getAdapter3() { ...} 
} 

如果您將「返回3個適配器」的想法封裝到自己的類中,這樣可以將其用作返回類型(當然,您可能會發現一個更合適的類名) 。

0

在Java中,數組的大小不是其類型的一部分。換句話說,具有給定基類型的所有數組類型都是相同的。此外,您不能使用方法簽名對數組類型參數或結果的大小施加限制。

這意味着你剩下的編碼方法是測試(在你的情況下)它將要返回的數組長度。這可能不會對你有太大幫助,因爲我假設你正在試圖利用靜態類型來強制你的數組的「三重性」。從這個角度看@馬特B的答案是錢,但你可以做這樣做的方式,還爲您提供了陣列(長度3):

public class AdapterTriple { 
    private Adapter[] adapters; 
    /** 
    * This constructor may throw an exception 
    */ 
    public AdapterTriple(Adapter[] adapters) { 
     if (adapters.length != 3) { 
      throw new IllegalArgumentException("array length is wrong"); 
     } 
     this.adapters = adapters; 
    } 
    /** 
    * This constructor won't throw an exception (apart from Errors) 
    */ 
    public AdapterTriple(Adapter adapter1, Adapter adapter2, Adapter adapter3) { 
     this.adapters = adapters = new Adapters[] { 
       adapter1, adapter2, adapter3}; 
    } 
    /** 
    * @return an array of 3 adapters. 
    */ 
    public Adapter[] { 
     return adapters; 
    } 
} 

總之,你不能強制數組尺寸限制靜態Java的。您必須動態執行此操作,但您可以採取措施避免運行時錯誤。