“无法创建通用数组…” – 如何创建Map 数组?

我想使用simpleJdbcInsert类和executeBatch方法

public int[] executeBatch(Map[] batch) 

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

所以我需要传递一个Map数组作为参数。 如何创建这样的数组? 我试过的是

 Map[] myArray = new HashMap[10] 

它是错误的:无法创建Map通用数组

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

由于Java中的generics如何工作,您无法直接创建generics类型的数组(例如Map[] )。 相反,您创建一个原始类型的数组( Map[] )并将其转换为Map[] 。 这将导致不可避免(但可以抑制)的编译器警告。

这应该适合您的需要:

 Map[] myArray = (Map[]) new Map[10]; 

您可能希望使用@SupressWarnings("unchecked")注释此方法,以防止显示警告。

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

  1. 创建地图列表。

     List> myData = new ArrayList>(); 
  2. 初始化数组。

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

     myDataArray = myData.toArray(myDataArray); 

我对此有一些困难,但我已经想出了一些我将尽可能简单分享的内容。

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

 public class CircularArray { 

其中包含数据成员:

 private E[] data; 

但你不能制作类型generics的数组,所以它有方法:

 @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 

这适用于genericsgenerics,但我需要一个可以排序的列表:可比较的列表。

 public class SortedCircularArray> { //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 

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

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

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

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

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

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

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

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

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

对我来说,这听起来很微弱。 我认为任何对generics有足够理解的程序员都会非常好,甚至可以预期,在这种情况下不会抛出ArrayStoredException。

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

 List arrayOfLists = (List) new List[2]; 

这将使他们与ArrayStoreException完全相同的风险不被抛出。

据我所知

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

例:

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

通过这种方式,您可以创建一个通用数据类型的数组