vectores tipos matrices llenar guardar declarar datos como arreglos arreglo java arraylist casting warnings unchecked-cast

java - tipos - Tipo de seguridad: conversión sin marcar del objeto a la lista de arreglos<MyVariable>



tipos de arreglos en java (4)

Aquí hay una parte de un programa que envía un ArrayList desde un servidor a un cliente. Quiero eliminar la advertencia sobre la última línea en este código:

Codigo del cliente:

Socket s; (...) // A server is sending a list from the other side of the link. ois = new ObjectInputStream(s.getInputStream()); MyList = (ArrayList<MyVariable>) ois.readObject();

MyVariable es una clase de Java con algunos atributos. El servidor está creando un ArrayList y llenándolo con variables MyVariable como elementos. Luego envía la lista completa al cliente.

Me gustaría saber por qué tengo una advertencia allí y cómo codificar perfectamente para tener 0 advertencias. Si es posible, me gustaría evitar el uso de "@SuppressWarnings (" unchecked ")". ;)

Gracias,

Luis


Es imposible evitar esta advertencia. readObject() devuelve un objeto. Necesitas lanzarlo. Y la conversión a un tipo genérico siempre generará dicha advertencia.

Si desea que su código sea lo más limpio posible, lo que es una buena idea, debe respetar las convenciones de nomenclatura de Java, y hacer que los nombres de las variables comiencen con una letra minúscula.


Me encontré con un problema similar al de OP y encontré una buena solución con una combinación de comentarios de @VGR y el método Java 1.8 para Arrays.

Proporcionaré mi respuesta en términos de la pregunta de OP, por lo que es genérica y espero que ayude a otros:

  1. En lugar de devolver una colección (lista), devuelva una matriz desde el servidor. Convierta la recopilación en una matriz utilizando lo siguiente en el código del lado del servidor:

    myVariableList.toArray(new MyVariable[0]);

    Si el rendimiento es un problema con lo anterior, se podría usar lo siguiente, por lo que no es necesario cambiar el tamaño de la matriz:

    myVariableList.toArray(myVariableList.size());

  2. En el lado del cliente, convierta la matriz de objetos a una matriz de la clase MyVariable.

    Esto es específico para JAVA 8.

    MyVariable[] myVarArr = Arrays.stream(ois.readObject()).toArray(MyVariable[]::new);

  3. Luego, finalmente convierte Array a una colección (lista).

    List<MyVariable> myList = Arrays.asList(myVarArr);

Gracias.


No me gusta eso, pero puedes tener un contenedor (una especie de alias o typedef):

// add "implements Serializable" in your case private static class MyVariableList { public List<MyVariable> value; }

Y trabajar con MyVariableList en MyVariableList lugar. De esa manera, proporciona explícitamente suficiente información al compilador para realizar la verificación de tipos en tiempo de ejecución.


Prueba esto

Object obj = ois.readObject(); // Check it''s an ArrayList if (obj instanceof ArrayList<?>) { // Get the List. ArrayList<?> al = (ArrayList<?>) obj; if (al.size() > 0) { // Iterate. for (int i = 0; i < al.size(); i++) { // Still not enough for a type. Object o = al.get(i); if (o instanceof MyVariable) { // Here we go! MyVariable v = (MyVariable) o; // use v. } } } }