web-dev-qa-db-fra.com

Avertissement ArrayList est un type brut. Les références au type générique ArrayList <E> doivent être paramétrées

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?

21
Diego

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 Es 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. Es dans les signatures de méthode deviennent simplement Objects.

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.

47
Natix

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é.

4
Marc Chambers

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/

1
Swav

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?

1
Hui Zheng