2011-06-10 38 views
8

是否有可能在ArrayList中存儲對象類型的混合?如果是這樣如何?Java - Mixed ArrayLists?

這是我到目前爲止已經試過:

List<Object> list = new ArrayList<Object>(); 

list.add(new String("Hello World")); 
list.add(new Integer(1)); 
list.add(new Long(1l)); 

for (i = 0; i < list.size(); i++) { 
    if (list.get(i) instanceof String){ 
     sqlPreparedStatement.setString((i+1), (String) list.get(i)); 
    } else if (list.get(i) instanceof Integer) { 
     sqlPreparedStatement.setInt((i+1), (Integer) list.get(i)); 
    } else if (list.get(i) instanceof Long) { 
     sqlPreparedStatement.setLong((i+1), (Long) list.get(i)); 
    } 
} 

但它拋出一個異常鑄造。

在此先感謝您的任何意見!

+7

定義「不起作用」。 – 2011-06-10 00:12:42

+0

爲什麼使用對象進行參數化?你得到了什麼? – Jeremy 2011-06-10 00:13:58

+7

@Jeremy:它避免了Eclipse中惱人的黃色下劃線! – 2011-06-10 00:15:53

回答

18

這是你應該擁有的一切:

List<Object> list = new ArrayList<Object>(); 

list.add(new String("Hello World")); 
list.add(new Integer(1)); 
list.add(new Long(1l)); 

for (Object obj: list) { 
    if (obj instanceof String){ 
     sqlPreparedStatement.setString((String) obj); 
    } else if (obj instanceof Integer) { 
     sqlPreparedStatement.setInt((Integer) obj); 
    } else if (obj instanceof Long) { 
     sqlPreparedStatement.setLong((Long) obj); 
    } 
} 
+6

順便說一句,不需要「new String()」。 – 2011-06-10 00:43:06

+2

@scientiaesthete:除了List#get(int)被調用的次數與你的次數一樣多,並且使用了一個迭代器,你的代碼片段和OP之間沒有區別。我在這裏錯過了什麼 - 在鑄造方面有什麼不同? – bguiz 2011-06-10 00:43:40

+1

@bguiz setXXX()簽名是不同的。 OP的'setXXX(int,XXXthing)',這個只是'setXXX(XXXthing)'。其中之一不符合API,methinks。 – Atreys 2011-06-10 01:02:56

10

對不起崩潰您的遊行,但你不應該使用的3(或有)一個ArrayList不同類型的開始。如果信息相關,則創建一個包含相關信息的類並創建一個僅包含一個類型的ArrayList:此類的對象。

編輯1:
例如說一個類來保存數據,像這樣:

class SqlData { 
    private String textData; 
    private int intData; 
    private long longData; 

    public SqlData(String textData, int intData, long longData) { 
     this.textData = textData; 
     this.intData = intData; 
     this.longData = longData; 
    } 

    public String getTextData() { 
     return textData; 
    } 

    public int getIntData() { 
     return intData; 
    } 

    public long getLongData() { 
     return longData; 
    } 

} 

,並使用像這樣:

List<SqlData> sqlDataList = new ArrayList<SqlData>(); 
    sqlDataList.add(new SqlData("Hello World", 1, 11L)); 

    for (int i = 0; i < sqlDataList.size(); i++) { 
    try { 
     sqlPreparedStatement.setString(i + 1, sqlDataList.get(i).getTextData()); 
     sqlPreparedStatement.setInt(i + 1, sqlDataList.get(i).getIntData()); 
     sqlPreparedStatement.setLong(i + 1, sqlDataList.get(i).getLongData()); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    } 
+2

這種方法更具描述性。但我認爲我們在這裏不需要'sqlDataList'和'for'循環。 – Genzer 2011-06-10 03:49:33

+0

+1 // @ Hovercraft:只是爲了抵消你可能得到的「復仇」downvote;而且我也同意你不應該在任何列表中混合不同類型的對象,可能的例外是繼承的類型(服從「is-a」規則) – bguiz 2011-06-10 06:56:08

+1

儘管不應將不同類型的對象混合到列表中,但這並不意味着人們不能並且不存在那裏有這種類型的代碼的軟件。 – Atreys 2011-06-10 11:39:29

4

你爲什麼做這個這麼難? PreparedStatementsetObject()方法 - 只需要使用:

List<Object> list = new ArrayList<Object>(); 
    list.add(new String("Hello World")); 
    list.add(new Integer(1)); 
    list.add(new Long(1l)); 
    for (int i = 0; i < list.size(); i++) 
     sqlPreparedStatement.setObject(i + 1, list.get(i)); // NOTE: columns count from 1 

注意:Java SQL API從1計數的一切,而不是零,所以列編號爲1〜大小(),而不是0 ... size() - 1