Java &引用;无法创建..";-如何创建地图数组<;字符串,对象>;?

Java &引用;无法创建..";-如何创建地图数组<;字符串,对象>;?,java,arrays,map,hashmap,Java,Arrays,Map,Hashmap,我想使用simpleJdbcInsert类和executeBatch方法 public int[] executeBatch(Map<String,Object>[] batch) public int[]executeBatch(映射[]批处理) 所以我需要传递一个Map数组作为参数。如何创建这样一个数组? 我试过的是 Map<String, Object>[] myArray = new HashMap<String, Object>[10] Ma

我想使用simpleJdbcInsert类和executeBatch方法

public int[] executeBatch(Map<String,Object>[] batch)
public int[]executeBatch(映射[]批处理)

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

Map<String, Object>[] myArray = new HashMap<String, Object>[10]
Map[]myArray=newhashmap[10]
错误:无法创建
Map

列表
会更简单,但我想我需要一个数组。那么如何创建
映射的数组呢?

谢谢

因为Java中的泛型是如何工作的,所以不能直接创建泛型类型的数组(例如
Map[]
)。而是创建一个原始类型的数组(
Map[]
),并将其强制转换为
Map[]
。这将导致不可避免的(但可抑制的)编译器警告

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

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

您可能希望使用
@SuppressWarnings(“unchecked”)
注释出现这种情况的方法,以防止显示警告。

您可以创建映射的通用数组

  • 创建地图列表

    List<Map<String, ?>> myData = new ArrayList<Map<String, ?>>();
    

  • 我在这方面遇到了一些困难,但我已经想出了一些我将尽可能简单地分享的事情

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

    public class CircularArray<E> {
    
    但不能使和数组的类型为泛型,因此它具有以下方法:

    @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
    
    但是我们的新类抛出了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
    
    我希望这会有所帮助,如果我犯了错误,我希望我们更有经验的用户会纠正我。

    来自[sic]:

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

    List<Integer>[] arrayOfLists = new List<Integer>[2];  // compile-time error
    
    如果对通用列表尝试相同的操作,则会出现问题:

    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.
    
    Object[]stringLists=新列表[];//编译器错误,但假设它是允许的
    StringList[0]=新的ArrayList();//好啊
    StringList[1]=新的ArrayList();//应引发ArrayStoreException,
    //但是运行时无法检测到它。
    
    如果允许参数化列表的数组,那么前面的代码将无法抛出所需的ArrayStoreException

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

    更重要的是,大多数程序员只需执行以下操作:

    List<Integer> arrayOfLists = (List<Integer>) new List[2];
    
    List arrayOfLists=(List)新列表[2];
    
    就我所知,这将使它们面临与未抛出ArrayStoreException完全相同的风险。

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

    例如:

    class Example<DataType>{
        public DataType array = (DataType[]) new Object[5] ; 
    }
    
    类示例{
    公共数据类型数组=(数据类型[])新对象[5];
    }
    
    通过这种方式,您可以创建泛型数据类型的数组

    @SuppressWarnings("unchecked")
    private Map<String,?>[] newArray(int n) {
      return new Map[n];
    }
    
    地图的
    列表一起使用

    注意:SuppressWarnings技巧在JDK src-


    归功于:@jonathancalen

    我可能会从一个列表开始,因为我不喜欢处理Java数组。。但这仍然是一个有效的问题。@pst:将其作为答案发布。我讨厌使用泛型数组(我上次尝试的答案是错误的,因为我忘记了泛型有多坏)。当我使用LinkedHashMap_数组[]=new LinkedHashMap[2],它也给出了这个错误?现在我不明白这里的“通用”是什么?@Diffy“通用”部分是类型参数
    。要删除错误(并替换为警告),请使用
    LinkedHashMap[]map_array=(LinkedHashMap)new LinkedHashMap[2]是的,我通过简单地使用新的LinkedHashMap[2]摆脱了错误,但如果我使用对象数据类型或“T”(通用tmplate),它将是通用的。为什么是通用的?我在这里指定正确的数据类型“Generic”在本例中表示“具有类型参数或由类型参数定义的类型”。所以
    LinkedHashMap
    变成
    LinkedHashMap
    T
    变成
    对象(通常)等等。
    
    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.
    
    List<Integer> arrayOfLists = (List<Integer>) new List[2];
    
    class Example<DataType>{
        public DataType array = (DataType[]) new Object[5] ; 
    }
    
    @SuppressWarnings("unchecked")
    private Map<String,?>[] newArray(int n) {
      return new Map[n];
    }
    
      sql.executeBatch(myStream.toArray(this::newArray));
    
      sql.executeBatch(myList.toArray(newArray(0));