2013-02-17 6 views
26

Chciałbym użyć klasy simpleJdbcInsert i sposobu executeBatch"Nie można utworzyć ogólnej tablicy .." - jak utworzyć tablicę mapy <ciąg, obiekt>?

public int[] executeBatch(Map<String,Object>[] batch) 

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/simple/SimpleJdbcInsert.html

więc muszę przekazać tablicę Map<String,Object> jako parametr. Jak stworzyć taką tablicę? Co próbowałem to

Map<String, Object>[] myArray = new HashMap<String, Object>[10] 

To błąd: Nie można utworzyć ogólną tablicę Map<String, Object>

List<Map<String, Object>> byłoby łatwiejsze, ale myślę, że trzeba tablicę. Jak utworzyć tablicę z Map<String, Object>? Dzięki

+0

Najprawdopodobniej zacznę od listy i [zamień ją w tablicę zgodnie z potrzebą] (http://docs.oracle.com/javase/6/docs/api/java/util/List.html#toArray (T [])), ponieważ nie lubię zajmować się tablicami Java ... ale to wciąż jest ważne pytanie. –

+0

@pst: Opublikuj jako odpowiedź. Nienawidzę rzucania ogólnych tablic (moja ostatnia próba odpowiedzi była niepoprawna, ponieważ zapomniałem jak łamano generyczne). – nneonneo

Odpowiedz

47

Z powodu tego, jak generics w Javie działa, nie można bezpośrednio utworzyć tablicy typu ogólnego (np. Map<String, Object>[]). Zamiast tego należy utworzyć tablicę typu surowego (Map[]) i przesłać ją do Map<String, Object>[]. Spowoduje to nieuniknione (ale niemożliwe) ostrzeżenie kompilatora.

To powinno działać, czego potrzebujesz:

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

Możesz opisywanie sposobu ten pojawia się z @SupressWarnings("unchecked"), aby zapobiec ostrzeżenie przed pokazane.

+0

gdy używam LinkedHashMap map_array [] = new LinkedHashMap [2]; , daje również ten błąd? Teraz nie rozumiem, co jest tutaj "ogólne"? – Diffy

+0

@Diffy Część "rodzajowa" to parametry typu ''. Aby usunąć błąd (i zastąpić go ostrzeżeniem), użyj 'LinkedHashMap [] map_array = (LinkedHashMap ) new LinkedHashMap [2];' –

+0

Tak, wydostałem się z błędu przez używając po prostu nowej LinkedHashMap [2], ale byłby ogólny, gdybym użył typu danych Object lub "T" (ogólne tmplate). W jaki sposób ma charakter ogólny? Określam właściwy typ danych tutaj: – Diffy

1

Można utworzyć ogólną tablicę mapie

  1. Tworzenie listy map.

    List<Map<String, ?>> myData = new ArrayList<Map<String, ?>>(); 
    
  2. Inicjalizuj tablicę.

    Map<String,?>[]myDataArray=new HashMap[myData .size()]; 
    
  3. Zapełnij dane w tablicy z listy.

    myDataArray=myData.toArray(myDataArry); 
    
0

miałem pewne trudności z tym, ale zorientowali się kilka rzeczy, które będą dzielić się w najprostszy możliwy sposób.

Moje doświadczenia z leków generycznych jest ograniczona do zbiorów, więc używam ich w definicji klasy, takie jak:

public class CircularArray<E> { 

który zawiera element danych:

private E[] data; 

Ale nie możesz marka i tablica typów ogólnych, więc ma następującą metodę:

W konstruktorze:

data = newArray(INITIAL_CAPACITY); //Done for reusability 

Działa to dla ogólnych generycznych, ale potrzebowałem listy, która mogłaby zostać posortowana: listy Komparatorów.

public class SortedCircularArray<E extends Comparable<E>> { 
//any E that implements Comparable or extends a Comparable class 

który zawiera element danych:

private E[] data; 

Ale nasza nowa klasa wyrzuca 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 
} 

w konstruktorze wszystko jest takie samo:

data = newArray(INITIAL_CAPACITY); //Done for reusability 

Mam nadzieję, że s pomaga i mam nadzieję, że nasi bardziej doświadczeni użytkownicy poprawią mnie, jeśli popełniłem błędy.

0

Od Oracle tutorial [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.

do mnie, brzmi to bardzo słaby. Myślę, że każdy programista z wystarczającym zrozumieniem generyków byłby zupełnie w porządku, a nawet oczekiwałby, że wyjątek ArrayStoredException nie zostanie w takim przypadku zgłoszony.

Co więcej, większość programistów będzie po prostu zrobić:

List<Integer> arrayOfLists = (List<Integer>) new List[2]; 

który umieści je w dokładnie tym samym ryzyko ArrayStoreException nie rzucony.