2017-11-11 73 views
1

我是一個Java新手。我需要定義一個構造函數MyArrayList(Object type)來設置稍後添加到列表中的引用的類型。如何設置列表的參考類型?

簽名的構造函數不能更改。我也是不允許使用仿製藥

我嘗試做這樣的:

public class MyArrayList implements MyList { 
private Object[] theList; // array of objects 


public MyArrayList(Object type) { 
    theList = new type[0]; 

} 

,並得到一個編譯錯誤,因爲type不用上課。什麼是正確的方法來做到這一點?

+0

完全使用泛型和構造函數。 – luk2302

+0

*「並得到一個編譯錯誤」* - 總是發佈我們所得到的完整錯誤。否則,你會將觀衆縮小到立即知道問題出在哪裏的人。 – Zabuza

+0

@abovady如果用戶回答你的問題,請也接受他的回答([接受答案:它是如何工作的?](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作))。如果不是,那麼請說明還沒有答案,這是StackOverflow的重要組成部分,非常感謝。 – Zabuza

回答

0

正如你說,你不想使用泛型,您可以通過Array#newInstancedocumentation)動態地創建陣列。這是您的調整代碼:

public class MyArrayList implements MyList { 
    private Object[] theList; 

    public MyArrayList(Object type) { 
     // Adjust as you like 
     int size = 0; 
     // Dynamically create array of type "type" 
     theList = (Object[]) Array.newInstance(type.getClass(), size); 
    } 
} 

因爲你不知道在編譯時類,你只能用它作爲Object[]但只會讓真正的類型的type的元素在運行時,一旦類型已知,並非任意Object s。


注意陣列固定大小的。你不能只添加元素,它的大小總是固定的,必須事先知道。如果您需要更動態的結構,請使用List(例如,ArrayListLinkedList)。

然後,您可以只記得給type對象,如果用戶試圖添加項目您檢查element instanceof type且僅當返回true添加,否則拋出一個異常,像IllegalArgumentException左右。或者,如上所述,爲您的陣列設置一個很好的固定大小。您也可以在構造函數中提供size參數給用戶。

+0

謝謝,我試圖實現你的解決方案,但是當我動態創建一個數組時,我得到了一個編譯器錯誤「類型不匹配」。 'newInstance'返回一個Object,'theList'是Object []。 – abovady

+0

@abovady由於該方法返回的是Object而不是數組(但實際的類型實際上是數組),所以我編輯了代碼並將一個強制類型添加到Object []中。你可以再試一次嗎? – Zabuza

+0

謝謝,它的工作。我的數組的大小很靈活。如果添加的元素超出邊界,則將數組添加到數組的末尾。我通過創建一個長度爲+1的新數組並將舊數組的內容複製到一個新數組中來完成。 – abovady

0

在Java中這種情況的答案是「泛型」。 java官方documentation是學習泛型的好地方。

對於這種情況,你可以按照如下

列表接口編寫的代碼

package test.generics; 

public interface MyList<T> { 
    T get(int index); 
    void add(T input); 
    void clear(); 
} 

實施

package test.generics; 

public class MyArrayList<T> implements MyList<T> { 

    private Object[] storage = new Object[10]; 
    private int index = 0; 

    @SuppressWarnings("unchecked") 
    @Override 
    public T get(int index) { 
     T temp = null; 
     if (!(index < 10 && index >= 0)) { 
      throw new IllegalArgumentException("Expected range 0 to 9"); 
     } else { 
      temp = (T) storage[index]; 
     } 
     return temp; 
    } 

    @Override 
    public void add(T input) { 
     if (index < 10) { 
      storage[index++] = input; 
     } else { 
      throw new IllegalArgumentException("Only 10 items supported"); 
     } 
    } 

    @Override 
    public void clear() { 
     index = 0; 
    } 

} 

消費者

package test.generics; 

public class Consumer { 

    public static void main(String[] args) { 
     MyList<Integer> intList = new MyArrayList<>(); 
     intList.add(10); 
     System.out.println(intList.get(0)); 
     MyList<String> stringList = new MyArrayList<>(); 
     stringList.add("hello"); 
     System.out.println(stringList.get(0)); 
    } 

} 
+0

我瞭解您的解決方案,但我不允許使用類型參數。我必須使用帶有我描述的簽名的構造函數。 – abovady