Java - 混合数组列表?

tra*_*ega 8 java collections mixed list arraylist

是否可以在ArrayList中存储对象类型的混合?如果是这样的话?

这是我到目前为止所尝试的:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

但它抛出一个铸造异常.

提前感谢任何输入!

sci*_*ete 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下,不需要"新的String()". (6认同)
  • @scientiaesthete:除了List#get(int)被调用的次数是你的两倍,并且使用了迭代器,你的代码片段与OP之间没有区别.我在这里遗漏了什么 - 关于铸造有什么不同? (2认同)

Hov*_*els 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;
   }

}
Run Code Online (Sandbox Code Playgroud)

并使用如下:

  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();
     }
  }
Run Code Online (Sandbox Code Playgroud)

  • 这种方法更具描述性.但我认为我们不需要`sqlDataList`和`for`循环. (2认同)

Boh*_*ian 5

你为什么这么努力?PreparedStatement有一个setObject()方法 - 只需使用:

    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
Run Code Online (Sandbox Code Playgroud)

注意:java SQL API计算从1而不是从零开始的所有内容,因此列编号为1 ... size()而不是0 ... size() - 1