wake-up-neo.com

"Generisches Array von .. kann nicht erstellt werden" - wie wird ein Array von Map <String, Object> erstellt?

Ich möchte die simpleJdbcInsert-Klasse und die Methode executeBatch verwenden

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

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

Ich muss also ein Array von Map<String,Object> als Parameter übergeben. So erstellen Sie ein solches Array? Was ich versucht habe, ist

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

Es ist ein Fehler: Generisches Array von Map<String, Object> kann nicht erstellt werden.

Ein List<Map<String, Object>> wäre einfacher, aber ich denke, ich brauche ein Array. So erstellen Sie ein Array von Map<String, Object>? Vielen Dank 

29
user2079650

Aufgrund der Funktionsweise von Generics in Java können Sie ein Array eines generischen Typs (z. B. Map<String, Object>[]) nicht direkt erstellen. Stattdessen erstellen Sie ein Array des Rohtyps (Map[]) und wandeln es in Map<String, Object>[] um. Dies führt zu einer unvermeidbaren (aber unterdrückbaren) Warnung des Compilers.

Dies sollte für das funktionieren, was Sie brauchen:

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

Möglicherweise möchten Sie die Methode kommentieren, in der dies mit @SupressWarnings("unchecked") vorkommt, um zu verhindern, dass die Warnung angezeigt wird.

53
Jonathan Callen

Sie können ein generisches Kartenfeld erstellen.

  1. Erstellen Sie eine Liste von Karten.

    List<Map<String, ?>> myData = new ArrayList<Map<String, ?>>();
    
  2. Array initialisieren.

    Map<String,?>[] myDataArray = new HashMap[myData.size()];
    
  3. Füllen Sie die Daten im Array von der Liste aus.

    myDataArray = myData.toArray(myDataArray);
    
1
Ruju

Ich hatte einige Schwierigkeiten damit, aber ich habe ein paar Dinge herausgefunden, die ich so einfach wie möglich mitteilen möchte.

Meine Erfahrung mit Generika beschränkt sich auf Kollektionen, daher verwende ich sie in den Klassendefinitionen wie:

public class CircularArray<E> {

welches den Datenmember enthält:

private E[] data;

Sie können jedoch kein generisches Array erstellen, daher gibt es die Methode:

@SuppressWarnings("unchecked")
private E[] newArray(int size)
{
    return (E[]) new Object[size];  //Create an array of Objects then cast it as E[]
}

Im Konstruktor:

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

Dies funktioniert für generische Generics, aber ich brauchte eine Liste, die sortiert werden konnte: eine Liste von Comparables.

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

welches den Datenmember enthält:

private E[] data;

Unsere neue Klasse löst jedoch Java.lang.ClassCastException aus:

@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
}

Im Konstruktor ist alles gleich:

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

Ich hoffe das hilft und ich hoffe, dass mich unsere erfahrenen Benutzer korrigieren, wenn ich Fehler gemacht habe.

0
Mikeologist

Soweit mein Wissen 

Versuchen Sie zuerst, ein Array von Java.lang.Object zu erstellen, und wandeln Sie dann in den generischen Typ T um

Beispiel:

class Example<DataType>{
    public DataType array = (DataType[]) new Object[5] ; 
}

Auf diese Weise können Sie ein Array mit generischem Datentyp erstellen

0
Mr. Suryaa Jha

Von Oracle-Tutorial [sic]:

Sie können keine Arrays mit parametrisierten Typen erstellen. Der folgende Code wird beispielsweise nicht kompiliert:

List<Integer>[] arrayOfLists = new List<Integer>[2];  // compile-time error

Der folgende Code veranschaulicht, was passiert, wenn verschiedene Typen in ein Array eingefügt werden:

Object[] strings = new String[2];
strings[0] = "hi";   // OK
strings[1] = 100;    // An ArrayStoreException is thrown.

Wenn Sie dasselbe mit einer generischen Liste versuchen, gibt es ein 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.

Wenn Arrays mit parametrisierten Listen zulässig waren, konnte der vorherige Code nicht die gewünschte ArrayStoreException auslösen.

Für mich klingt das sehr schwach. Ich denke, dass jeder Programmierer mit einem ausreichenden Verständnis von Generika vollkommen in Ordnung wäre und sogar davon ausgehen kann, dass die ArrayStoredException in diesem Fall nicht ausgelöst wird.

Darüber hinaus tun die meisten Programmierer einfach:

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

dadurch werden sie in genau das gleiche Risiko versetzt, dass ArrayStoreException nicht ausgelöst wird.

0
Stick Hero