簡體   English   中英

Java中設置長度數組的抽象方法?

[英]abstract method of a set length array in java?

我正在嘗試創建一個抽象的數組方法,該方法指定一個數組的抽象對象只能容納3個項目。

現在,我已經嘗試執行類似此public abstract BaseAdapter[3] adapters(); 但它抱怨有一個錯誤,即無法通過這種方式完成操作。

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

那會很好,但是子類仍然可以傳遞大於3個項目的數組

您可以這樣解決:

  • 使用返回類型BaseAdapter[]創建一個名為createAdapters()的抽象幫助程序方法(可以覆蓋)。

     protected abstract BaseAdapter[] createAdapters(); 
  • 在您的超類中,您具有執行以下操作的最終方法 adapters

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

另一種選擇是創建一個名為BaseAdapterTriple的簡單類(可能具有一個更具描述性的名稱),其中包含三個BaseAdapter,並將其用作返回值。

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

您似乎誤解了Java中abstract修飾符的含義。

abstract適用於方法 ,不適用於字段/變量,因此您嘗試執行的操作無效。

請描述您想要完成的工作,然后我們可以為您提供幫助:-)。

有關abstract的說明,請參見例如http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

不,您既不能使用數組也不能使用列表。 如果數字超過3,則可以引發異常並記錄此行為。

如果您想要一個adapters()方法最多只能返回3 BaseAdapter並具有子類來在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();
}

aioobe的答案是一個很好的選擇,但是我也建議一些不同的地方:

如果您需要一種方法來返回某個大小的數組,那么您可能想問一問為什么數組首先是該方法的適當返回類型,而不是使用簡單的POJO來輕松封裝“ 3個BaseAdapters”,即:

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

如果您將“ return 3 adapters”的概念封裝到它自己的類中,那么對於每個參與人員而言,它都將變得更加清晰,以便可以將其用作返回類型(當然,您可以為該類找到一個更合適的名稱)。

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

這意味着您需要對方法進行編碼,以測試(在您的情況下)要返回的數組的長度。 這可能對您沒有多大幫助,因為我假設您正在嘗試利用靜態類型來強制執行數組的“三元組”。 從這個角度來看,@ matt 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中靜態地強制執行數組大小約束。 您必須動態地執行此操作,但是可以采取措施使運行時錯誤不太可能發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM