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:
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());
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);
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.
}
}
}
}