43

我想使用 simpleJdbcInsert 类和 executeBatch 方法

public int[] executeBatch(Map<String,Object>[] batch)

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/simple/SimpleJdbcInsert.html

所以我需要传递一个Map<String,Object>作为参数的数组。如何创建这样的数组?我尝试的是

Map<String, Object>[] myArray = new HashMap<String, Object>[10]

这是错误:无法创建通用数组Map<String, Object>

AList<Map<String, Object>>会更容易,但我想我需要一个数组。那么如何创建一个数组Map<String, Object>呢?谢谢

4

6 回答 6

72

由于 Java 中泛型的工作方式,您不能直接创建泛型类型的数组(例如Map<String, Object>[])。Map[]相反,您创建一个原始类型 ( )的数组并将其转换为Map<String, Object>[]. 这将导致不可避免的(但可抑制的)编译器警告。

这应该可以满足您的需要:

Map<String, Object>[] myArray = (Map<String, Object>[]) new Map[10];

您可能想用 注释发生这种情况的方法@SuppressWarnings("unchecked"),以防止显示警告。

于 2013-02-17T02:56:51.363 回答
1

您可以创建通用地图数组。

  1. 创建地图列表。

    List<Map<String, ?>> myData = new ArrayList<Map<String, ?>>();
    
  2. 初始化数组。

    Map<String,?>[] myDataArray = new HashMap[myData.size()];
    
  3. 从列表中填充数组中的数据。

    myDataArray = myData.toArray(myDataArray);
    
于 2014-02-11T12:36:17.590 回答
0

我在这方面遇到了一些困难,但我想出了一些我会尽可能简单地分享的东西。

我对泛型的经验仅限于集合,因此我在类定义中使用它们,例如:

public class CircularArray<E> {

其中包含数据成员:

private E[] data;

但是你不能创建和数组的泛型类型,所以它有方法:

@SuppressWarnings("unchecked")
private E[] newArray(int size)
{
    return (E[]) new Object[size];  //Create an array of Objects then cast it as E[]
}

在构造函数中:

data = newArray(INITIAL_CAPACITY);  //Done for reusability

这适用于泛型泛型,但我需要一个可以排序的列表:Comparables 列表。

public class SortedCircularArray<E extends Comparable<E>> { 
//any E that implements Comparable or extends a Comparable class

其中包含数据成员:

private E[] data;

但是我们的新类抛出 java.lang.ClassCastException:

@SuppressWarnings("unchecked")
private E[] newArray(int size)
{
    //Old: return (E[]) new Object[size];  //Create an array of Objects then cast it as E[]
    return (E[]) new Comparable[size];  //A comparable is an object, but the converse may not be
}

在构造函数中一切都是一样的:

data = newArray(INITIAL_CAPACITY);  //Done for reusability

我希望这会有所帮助,如果我犯了错误,我希望我们更有经验的用户能纠正我。

于 2014-04-17T17:39:39.570 回答
0

来自Oracle 教程[原文如此]:

您不能创建参数化类型的数组。例如,以下代码无法编译:

List<Integer>[] arrayOfLists = new List<Integer>[2];  // compile-time error

以下代码说明了将不同类型插入数组时会发生什么:

Object[] strings = new String[2];
strings[0] = "hi";   // OK
strings[1] = 100;    // An ArrayStoreException is thrown.

如果您使用通用列表尝试相同的操作,则会出现问题:

Object[] stringLists = new List<String>[];  // compiler error, but pretend it's allowed
stringLists[0] = new ArrayList<String>();   // OK
stringLists[1] = new ArrayList<Integer>();  // An ArrayStoreException should be thrown,
                                            // but the runtime can't detect it.

如果允许参数化列表的数组,则前面的代码将无法抛出所需的 ArrayStoreException。

对我来说,这听起来很弱。我认为任何对泛型有足够了解的程序员都会很好,甚至期望在这种情况下不会抛出 ArrayStoredException。

更重要的是,大多数程序员只会这样做:

List<Integer> arrayOfLists = (List<Integer>) new List[2];

这将使它们处于完全相同的风险中,即未抛出 ArrayStoreException。

于 2016-09-29T10:25:24.057 回答
0

据我所知

首先尝试创建一个 java.lang.Object 数组,然后转换为通用类型 T

例子:

class Example<DataType>{
    public DataType array = (DataType[]) new Object[5] ; 
}

这样,您可以创建一个泛型数据类型的数组

于 2018-04-17T07:41:09.030 回答
0
@SuppressWarnings("unchecked")
private Map<String,?>[] newArray(int n) {
  return new Map[n];
}

与 a 一起Stream使用Map<String,?>

  sql.executeBatch(myStream.toArray(this::newArray));

与 a 一起List使用Map<String,?>

  sql.executeBatch(myList.toArray(newArray(0));

注意:JDK src 中积极使用了 SuppressWarnings 技巧 - https://github.com/AdoptOpenJDK/openjdk-jdk14/blob/master/src/java.base/share/classes/java/util/ArrayList.java#L395: L404

致谢:@JonathanCallen

于 2020-01-31T01:08:47.813 回答