2014-10-04 22 views
-1

我正在嘗試製作不同對象的列表。列出不同的對象Java

我知道我可以做一些對象,例如列表:

ArrayList<Matrices> list = new ArrayList<Matrices>(); 
list.add(new Matrices(1,1,10)); 
list.add(new Matrices(1,2,20)); 

,但我想做個列表,可以做這樣的事情:

list.add (new Object1(a,b,c)); 
list.add (new Object2(e,f)); 

顯然Object1和Object2的是不同的。

請在這裏給我一隻手。

+0

什麼樣的不同對象?當你檢索它們時,你怎麼知道它是什麼樣的對象? – 2014-10-04 21:52:11

+1

[創建一個具有多種對象類型的數組列表?]可能的重複(http://stackoverflow.com/questions/19602601/create-an-arraylist-with-multiple-object-types) – Boann 2014-10-04 21:55:04

回答

3

Vytenis的答案在技術上是正確的,但不是你應該定期做的事情。一個更具擴展性的解決方案是創建一個接口並同時實現兩個對象,讓列表保持兩個對象,而不會失去靜態類型列表通常帶來的安全性和優勢。雖然Java不喜歡類的多重繼承,但實現多個接口並不成問題。

例如,把你的類聲明:

class Object1{ 
    ... 
} 
... 
class Object2{ 
    ... 
} 

,並在頂層的地方添加下面的接口聲明 -

public interface SharedType{ 
    ... 
} 

每個對象要存儲,有它實施接口是這樣的:

public class Object1 implements SharedType{ 
    ... 
} 

當你聲明你的列表,聲明它像這樣的:

List<SharedType> mylist = new ArrayList<SharedType>(); 

或任何類型的列表,你想創建,顯然它並不必須是一個ArrayList

爲內置類型或類此將不工作誰的聲明中,您可以「T改變

使用接口如類型是Java常見的做法,見http://docs.oracle.com/javase/tutorial/java/IandI/interfaceAsType.html,例如

編輯

如果您需要存儲不同的內置類型(如字符串和整數),請按照註釋中的建議,考慮在它們周圍創建一個包裝對象。這有點麻煩,但是你不能輕易改變內建類的聲明,而使用像Object這樣的泛型類型應該是最後的手段,因爲它顛覆了首先要求類型規範的原因。

例如,

interface Wrapper{} 

class StringWrapper extends Wrapper{ 
    String s; 

    public StringWrapper(String s){ 
     this.s = s; 
    } 
} 

class IntWrapper extends Wrapper{ 
    String i; 

    public StringWrapper(Integer i){ 
     this.i = i; 
    } 
} 

有人看你的代碼(包括你,以後),現在知道,正是你試圖在你的列表中使用。你同樣可以獲得Java靜態類型的優勢

+0

+1 - 這是做事的正確方法。如果你的程序需要在同一個集合中存儲不相關的類型,那麼你正在設計錯誤的東西。 – Qix 2014-10-04 21:58:30

+0

但它不適用於標準對象。如果你必須在同一個'ArrayList'中存儲'String'和'Integer' – Jens 2014-10-04 22:00:21

2

使用List<Object>,那裏你將能夠存儲任何東西。

+0

'列表'是一個接口和不起作用。請添加一些說明。 – Qix 2014-10-04 21:52:29

+0

'List list = new ArrayList ();'95%沒有理由將變量聲明爲ArrayList,List就足夠了。 – 2014-10-04 21:54:31

+0

當然。雖然你的答案並沒有說明。此外,Java7中不鼓勵構造泛型類的類型。 – Qix 2014-10-04 21:57:09