"Невозможно создать общий массив..." - как создать массив карт <String, Object>?
Я хотел бы использовать класс 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>
A List<Map<String, Object>>
будет проще, но я думаю, мне нужен массив. Итак, как создать массив из Map<String, Object>
?
Спасибо
Ответы
Ответ 1
Из-за того, как работают дженерики в Java, вы не можете напрямую создать массив общего типа (например, Map<String, Object>[]
). Вместо этого вы создаете массив необработанного типа (Map[]
) и отбрасываете его на Map<String, Object>[]
. Это вызовет неизбежное (но подавляемое) предупреждение компилятора.
Это должно работать для того, что вам нужно:
Map<String, Object>[] myArray = (Map<String, Object>[]) new Map[10];
Вам может потребоваться аннотировать метод, в котором это происходит, с помощью @SupressWarnings("unchecked")
, чтобы предупреждение не отображалось.
Ответ 2
Вы можете создать общий массив карты
-
Создайте список карт.
List<Map<String, ?>> myData = new ArrayList<Map<String, ?>>();
-
Инициализировать массив.
Map<String,?>[]myDataArray=new HashMap[myData .size()];
-
Заполнение данных в массиве из списка.
myDataArray=myData.toArray(myDataArry);
Ответ 3
У меня были некоторые трудности с этим, но я выяснил несколько вещей, которые я поделюсь как можно проще.
Мой опыт работы с generics ограничен коллекциями, поэтому я использую их в определениях классов, например:
public class CircularArray<E> {
который содержит элемент данных:
private E[] data;
Но вы не можете сделать и массив типа generic, поэтому он имеет метод:
@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
Надеюсь, это поможет, и я надеюсь, что наши более опытные пользователи исправят меня, если я ошибаюсь.
Ответ 4
Из учебник Oracle [sic]:
Вы не можете создавать массивы параметризованных типов. Например, следующий код не компилируется:
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 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.