Java &引用;无法创建..";-如何创建地图数组<;字符串,对象>;?
我想使用simpleJdbcInsert类和executeBatch方法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
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));