web-dev-qa-db-fra.com

"Impossible de créer un tableau générique de .." - comment créer un tableau de carte <String, Object>?

Je voudrais utiliser la méthode simpleJdbcInsert et la méthode 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

J'ai donc besoin de passer un tableau de Map<String,Object> en paramètre. Comment créer un tel tableau? Ce que j'ai essayé, c'est

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

C'est erreur: impossible de créer un tableau générique de Map<String, Object>

Un List<Map<String, Object>> serait plus facile, mais je suppose que j'ai besoin d'un tableau. Alors, comment créer un tableau de Map<String, Object>? Merci 

29
user2079650

En raison du fonctionnement des génériques en Java, vous ne pouvez pas créer directement un tableau de type générique (tel que Map<String, Object>[]). Au lieu de cela, vous créez un tableau du type brut (Map[]) et le convertissez en Map<String, Object>[]. Cela entraînera un avertissement inévitable du compilateur (mais supprimable).

Cela devrait fonctionner pour ce dont vous avez besoin:

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

Vous voudrez peut-être annoter la méthode utilisée avec @SupressWarnings("unchecked") pour empêcher l'affichage de l'avertissement.

53
Jonathan Callen

Vous pouvez créer un tableau générique de carte.

  1. Créez une liste de cartes.

    List<Map<String, ?>> myData = new ArrayList<Map<String, ?>>();
    
  2. Initialiser le tableau.

    Map<String,?>[] myDataArray = new HashMap[myData.size()];
    
  3. Renseignez les données dans un tableau à partir de la liste.

    myDataArray = myData.toArray(myDataArray);
    
1
Ruju

J'ai eu quelques difficultés avec cela, mais j'ai compris quelques choses que je vais partager aussi simplement que possible.

Mon expérience des génériques étant limitée aux collections, je les utilise dans les définitions de classe, telles que:

public class CircularArray<E> {

qui contient le membre de données:

private E[] data;

Mais vous ne pouvez pas créer de tableau générique, la méthode est donc la suivante:

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

Dans le constructeur:

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

Cela fonctionne pour les génériques génériques, mais j'avais besoin d'une liste qui puisse être triée: une liste de produits comparables.

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

qui contient le membre de données:

private E[] data;

Mais notre nouvelle classe lève 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
}

Dans le constructeur, tout est pareil:

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

J'espère que cela aide et j'espère que nos utilisateurs plus expérimentés me corrigeront si j'ai commis des erreurs.

0
Mikeologist

Dans la mesure de mes connaissances 

Commencez par essayer de créer un tableau de Java.lang.Object, puis convertissez-le en type générique T

Exemple:

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

De cette façon, vous pouvez créer un tableau de type de données générique

0
Mr. Suryaa Jha

De tutoriel Oracle [sic]:

Vous ne pouvez pas créer de tableaux de types paramétrés. Par exemple, le code suivant ne compile pas:

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

Le code suivant illustre ce qui se passe lorsque différents types sont insérés dans un tableau:

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

Si vous essayez la même chose avec une liste générique, il y aurait un problème:

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.

Si les tableaux de listes paramétrées étaient autorisés, le code précédent ne générerait pas l'exception ArrayStoreException souhaitée.

Pour moi, cela semble très faible. Je pense que tout programmeur possédant une compréhension suffisante des génériques serait parfaitement correct, et même s’attend à ce que l’ArrayStoredException ne soit pas levée dans ce cas.

Encore plus, la plupart des programmeurs feront simplement:

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

ce qui les exposera exactement au même risque que ArrayStoreException ne soit pas levé.

0
Stick Hero