无法创建泛型数组 - 如何创建一个Map<String, Object>类型的数组?

46

我想使用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>的通用数组。

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


我可能会从一个List开始,并在需要时将其转换为数组,因为我不喜欢处理Java数组..但这仍然是一个有效的问题。 - user166390
@pst:将其作为答案发布。我讨厌强制转换通用数组(我的上一个回答尝试失败了,因为我忘记了泛型有多么糟糕)。 - nneonneo
6个回答

78
因为 Java 中泛型的工作方式,你不能直接创建一个泛型类型的数组(例如 Map<String, Object>[])。相反,你需要创建一个原始类型的数组 (Map[]) 并将其强制转换为 Map<String, Object>[]。这将导致一个不可避免的(但可以被抑制的)编译器警告。
对于你所需的内容,这应该可以正常工作:
Map<String, Object>[] myArray = (Map<String, Object>[]) new Map[10];

您可能希望在包含此警告的方法上添加@SuppressWarnings("unchecked")注释,以防止该警告被显示。


当我使用LinkedHashMap<String,String>map_array[] = new LinkedHashMap<String,String>[2];时,它也会报错?现在我不明白这里的“泛型”是什么意思? - Diffy
@Diffy “generic” 部分是类型参数 <String,String>。为了消除错误(并替换为警告),请使用 LinkedHashMap<String, String>[] map_array = (LinkedHashMap<String, String>) new LinkedHashMap[2]; - Jonathan Callen
是的,我通过使用简单的new LinkedHashMap[2]解决了错误,但如果我使用Object数据类型或“T”(通用模板),它将是通用的。为什么<String,String>是通用的?我在这里指定了正确的数据类型。 - Diffy
在这里,“泛型”意味着“具有类型参数或由类型参数定义的类型”。因此,LinkedHashMap<String, String> 变成了 LinkedHashMapT 变成了 Object(通常情况下)。 - Jonathan Callen

1
你可以创建一个通用的数组映射。
  1. 创建一个地图列表。

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

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

    myDataArray = myData.toArray(myDataArray);
    

0
根据我的了解,
首先尝试创建一个java.lang.Object数组,然后将其转换为泛型类型T。
例如:
class Example<DataType>{
    public DataType array = (DataType[]) new Object[5] ; 
}

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


0

来自Oracle教程[sic]:

You cannot create arrays of parameterized types. For example, the following code does not compile:

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

The following code illustrates what happens when different types are inserted into an array:

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

If you try the same thing with a generic list, there would be a problem:

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.

If arrays of parameterized lists were allowed, the previous code would fail to throw the desired ArrayStoreException.

对我来说,这听起来非常薄弱。我认为任何具有足够泛型理解的程序员,都会很好地适应甚至期望在这种情况下不抛出ArrayStoredException异常。
更重要的是,大多数程序员将会简单地执行:
List<Integer> arrayOfLists = (List<Integer>) new List[2];

这将使它们处于完全相同的风险中,即可能不会抛出ArrayStoreException异常。


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

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

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

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接