generic - java parameterized return type



Comment ajouter ArrayList<String> à JSON Array-en gardant à l'esprit la sécurité des types (4)

Eclipse a affiché un avertissement de sécurité de type et j'ai essayé presque tout pour l'éradiquer (bien sûr en supprimant ce serait une option) mais malheureusement je n'ai eu aucun succès.
Savez-vous comment je dois changer mon code pour qu'il n'y ait plus d'avertissement de sécurité de type. Ou est @SuppressWarnings("unchecked") le seul moyen?

ArrayList<String> arrayList= (ArrayList<String>) Classname.getArrayList();      
JSONArray obj = new JSONArray();
obj.addAll(arrayList); 

dans la dernière ligne, l'avertissement de sécurité de type suivant est affiché:

Type de sécurité: La méthode addAll (Collection) appartient au type brut ArrayList. Les références au type générique ArrayList doivent être paramétrées

JSONArray provient de org.json.simple.JSONArray . Recommanderiez-vous un autre paquet?

https://ffff65535.com


De la documentation pour JSONArray , il semble que cela extends ArrayList le type brut (il n'a pas de paramètre de type générique). C'est un exemple de traitement d'un code hérité non générique, et la seule façon de procéder est de s'assurer que JSONArray s'attend à recevoir des String s puis de supprimer l'avertissement.

(Le vrai moyen de le réparer serait de mettre à jour JSONArray pour utiliser des génériques, mais en attendant, vous devez utiliser le type brut.)


La réponse courte à votre question est que vous devez la supprimer pour qu'elle disparaisse. Le problème n'est pas au sujet de ce que vous mettez en utilisant la méthode addAll, c'est parce que JSONArray n'a aucun moyen de garantir la sécurité du type si le type n'est pas fourni.

JSONArray hérite d'une ArrayList non paramétrée et la méthode addAll est définie comme suit:

public boolean addAll(java.util.Collection<? extends E> es)

Sans fournir le paramètre type, E revient à Object, ce qui fait de la méthode addAll une méthode qui peut ajouter une collection contenant ANYTHING au-dessus des collections existantes. Par conséquent, vous pouvez faire quelque chose comme ceci:

List<Dog> dogs = new ArrayList<Dog>();
dogs.add(new Chiwawa());

List<Car> cars = new ArrayList<Car>();
cars.add(new BMW());

JSONArray jsonArray = new JSONArray();
jsonArray.addAll(dogs);
jsonArray.addAll(cars);

Les chiens et les voitures sont ajoutés ensemble au même JSONArray (ArrayList) et traités à peine comme Object. Si vous faites quelque chose comme ça, quand vous récupérez un objet, vous n'avez aucun moyen de savoir s'il s'agit d'un chien ou d'une voiture. C'est pourquoi l'avertissement existe.

En utilisant le paramètre de type générique (par exemple Dog), la définition de addAll sera comme:

 public boolean addAll(java.util.Collection<? extends Dog> es)

Ceci s'assure que le paramètre peut seulement accepter une collection de la classe d'enfant de Dog and Dog. Par conséquent, lorsque vous le récupérez dans la collection, vous pouvez attribuer l'objet de récupération à Dog.

L'avertissement n'est pas à cause de vous avez fait quelque chose de mal. C'est parce que JSONArray hérite d'une collection non paramétrée. N'hésitez pas à le supprimer.


org.json et org.json.simple L'analyseur JSON utilise des types de collections brutes en dessous. Si vous recherchez un support générique, essayez Google Gson . Voici comment procéder pour sérialiser votre ArrayList générique avec Gson:

Gson gson = new Gson();

ArrayList<String> arrayList= (ArrayList<String>) ClassName.getArrayList();

// Serializing to a JSON element node
JsonElement jsonElement = gson.toJsonTree(arrayList);
System.out.println(jsonElement.isJsonArray()); // true

// Or, directly to JSON string
String json = gson.toJson(arrayList);
System.out.println(json);

Voici comment désérialiser la même chaîne JSON avec ses génériques intacts:

Type type = new TypeToken<ArrayList<String>>(){}.getType();
ArrayList<String> arrayList = gson.fromJson(json, type);

Utilisez la bibliothèque Gson pour convertir ArrayList en JsonArray .

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();




type-safety