Duplicata possible:
ArrayList est un type brut. Les références au type générique ArrayList <E> doivent être paramétrées
Afin d'enregistrer une ArrayList avec des paiements effectués par un membre, je veux changer la liste des ID de paiement en une chaîne, j'ai donc créé la méthode suivante:
public String fromArraytoString(ArrayList items){
JSONObject json = new JSONObject();
json.put("uniqueArrays", new JSONArray(items));
return json.toString();
}
Mais je reçois l'avertissement suivant:
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized
Quelqu'un peut-il m'expliquer pourquoi?
Vous devez absolument lire ce tutoriel sur Java generics : http://docs.Oracle.com/javase/tutorial/Java/generics /
En bref:
De nombreux Java (appelés classes génériques ou types génériques), généralement des collections, ont ce qu'on appelle type parameters, comme E
in ArrayList<E>
(E
est juste un nom choisi arbitrairement, d'autres classes le nomment comme T
ou autre):
public class ArrayList<E> extends ... {
public E get(int index) { ... }
public boolean add(E element) { ... }
// other methods...
}
Maintenant, lorsque vous créez une instance d'une telle classe, vous définissez une valeur concrète du paramètre type, par exemple String
(E
peut généralement être évalué selon le type que vous voulez):
ArrayList<String> stringList = new ArrayList<String>();
Désormais, tous les E
s sont "remplacés" par String
pour la variable stringList
, vous pouvez donc y ajouter uniquement des chaînes et en obtenir uniquement des chaînes. Le compilateur vérifie pour vous que vous n'ajoutez pas par erreur un objet d'un autre type:
stringList.add(Integer.valueOf(1));
// compile error - cannot add Integer to ArrayList of Strings
Cependant, comme des génériques ont été ajoutés à Java 5, il est toujours possible d'écrire du code sans eux pour une compatibilité descendante. Vous pouvez donc écrire:
ArrayList list = new ArrayList();
Mais vous perdez tous les avantages de la vérification de type. E
s dans les signatures de méthode deviennent simplement Object
s.
list.add(Integer.valueOf(42)); // adding an Integer
list.add("aaa"); // adding a String
Object something = list.get(0); // unknown type of returned object, need to cast
Integer i0 = (Integer) something; // this unsafe cast works...
Integer i1 = (Integer) list.get(1); // but this fails with a ClassCastException
// because you cannot cast a String to Integer
Le fait que l'utilisation d'un type brut (qui est un type générique avec ses paramètres de type omis) n'est pas sûr, est la raison de l'avertissement que vous avez. Au lieu de simplement ArrayList
, utilisez ArrayList<String>
ou ArrayList<Integer>
ou quel que soit le type de votre items
.
Quels types d'objets sont stockés dans ArrayList? Vous devez l'ajouter à la déclaration. C'est toujours
ArrayList<Type>
Donc, si c'est une liste de JSONObjects, vous mettriez
ArrayList<JSONObject>
J'espère que ça t'as aidé.
C'est parce que Java essaie de faire certaines vérifications pour vous. La façon dont vous l'avez écrit vous dit effectivement au compilateur que vous recevrez ArrayList of Object's comme paramètre. Il vous encourage simplement à spécifier la classe d'objets vous allez stocker dans ArrayList. Spécifiant ArrayList<MyClass>
ou ArrayList <?>
supprimerait l'avertissement. La deuxième version indique effectivement au compilateur que vous passeriez ArrayList des objets de classe inconnus au moment de la compilation.
Je pense qu'il pourrait être utile pour vous de lire un peu sur les génériques en Java. http://docs.Oracle.com/javase/tutorial/Java/generics/
Le constructeur de JsonArray
s'attend à recevoir un type générique Collection
avec le paramètre T
, tandis que le type de items
est ArrayList
sans type spécifié (c.-à-d. type brut). Vous pouvez vérifier cette question pour avoir une idée du type brut: Qu'est-ce qu'un type brut et pourquoi ne devrions-nous pas l'utiliser?
Solution 1 (recommandée): passez items
avec le paramètre T
ou spécifiez un type de béton tel que String
. Cette question peut vous aider dans votre problème spécifique: convertir ArrayList <MyCustomClass> en JSONArray .
Solution 2: ajoutez @SuppressWarnings("unchecked")
avant la méthode fromArraytoString
. Ce n'est pas recommandé, mais vous pouvez vous référer à cette question: Qu'est-ce que SuppressWarnings ("non vérifié") en Java?