Подтвердить что ты не робот

"Невозможно создать общий массив..." - как создать массив карт <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>? Спасибо

4b9b3361

Ответ 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.