parametrizadas genericos clases arreglos java list generics

java - genericos - Warning ArrayList es un tipo en bruto. Las referencias al tipo genérico ArrayList<E> se deben parametrizar



arreglos genericos en java (4)

¿Qué tipo de objetos se almacenan en el ArrayList? Necesitas añadirlo a la declaración. Siempre es

ArrayList<Type>

Así que si es una lista de JSONObjects, pondrías

ArrayList<JSONObject>

Espero que ayude.

Posible duplicado:
ArrayList es un tipo en bruto. Las referencias al tipo genérico ArrayList <E> se deben parametrizar

Para guardar una ArrayList con los pagos realizados por un miembro, quiero cambiar la Lista de ID de pago en una cadena, por lo que creé el siguiente método:

public String fromArraytoString(ArrayList items){ JSONObject json = new JSONObject(); json.put("uniqueArrays", new JSONArray(items)); return json.toString(); }

Pero me sale la siguiente advertencia:

ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

¿Alguien me puede explicar por qué?


El constructor de JsonArray espera recibir una Collection tipo genérico con el parámetro T , mientras items el tipo de los elementos es ArrayList sin el tipo especificado (es decir, el tipo sin procesar). Puede consultar esta pregunta para tener una idea acerca del tipo en bruto: ¿Qué es un tipo en bruto y por qué no deberíamos usarlo?

Solución 1 (recomendada): pase los items con el parámetro T o especifique un tipo concreto como String . Esta pregunta podría ayudarlo en su problema específico: convertir ArrayList <MyCustomClass> a JSONArray .

Solución 2: agregue @SuppressWarnings("unchecked") antes del método fromArraytoString . Esto no se recomienda, pero puede referirse a esta pregunta: ¿Qué es SuppressWarnings ("unchecked") en Java?


Esto se debe a que el compilador de Java intenta realizar ciertas comprobaciones por usted. La forma en que lo ha escrito le dice al compilador que recibirá ArrayList of Object''s como parámetro. Simplemente lo alienta a especificar la clase de objetos que almacenará en ArrayList. Especificar ArrayList<MyClass> o ArrayList <?> Eliminaría la advertencia. La segunda versión le dice al compilador que pasaría ArrayList de objetos de clase desconocidos en el momento de la compilación.

Creo que podría ser útil para usted leer un poco acerca de los genéricos en Java. http://docs.oracle.com/javase/tutorial/java/generics/


Definitivamente debería leer este tutorial sobre los genéricos de Java : http://docs.oracle.com/javase/tutorial/java/generics/

En una palabra:

Muchas clases y tipos de Java (llamadas clases genéricas o tipos genéricos ), típicamente colecciones, tienen los llamados parámetros de tipo , como E en ArrayList<E> ( E es solo un nombre elegido arbitrariamente, otras clases lo nombran como T o lo que sea):

public class ArrayList<E> extends ... { public E get(int index) { ... } public boolean add(E element) { ... } // other methods... }

Ahora, cuando crea una instancia de dicha clase, define un valor concreto del parámetro de tipo, por ejemplo, String (por lo general, E puede evaluarse según el tipo que desee):

ArrayList<String> stringList = new ArrayList<String>();

A partir de ahora, todas las E se "reemplazan" por String para la variable stringList , por lo que puede agregar solo Strings y obtener solo Strings de ella. El compilador comprueba que usted no agrega un objeto de otro tipo por error:

stringList.add(Integer.valueOf(1)); // compile error - cannot add Integer to ArrayList of Strings

Sin embargo, debido a que los genéricos se agregaron a Java 5, todavía es posible escribir código sin ellos para la compatibilidad con versiones anteriores. Así que puedes escribir:

ArrayList list = new ArrayList();

Pero se pierden todos los beneficios de verificación de tipos. E firmas en el método se convierten en simples Object .

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

El hecho de que utilice un tipo sin procesar (que es un tipo genérico con sus parámetros de tipo omitidos) no es seguro, es el motivo de la advertencia que recibió. En lugar de solo ArrayList , use ArrayList<String> o ArrayList<Integer> o cualquiera que sea el tipo de sus items .