[英]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.