Aquí es una parte de un programa que envía un ArrayList de un servidor a un cliente. Quiero quitar la advertencia acerca de la última línea de este código:

Código de 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();

Mivariable es una clase Java con algunos atributos. El servidor es crear un ArrayList y llenar con Mivariable variables como elementos. A continuación, envía la lista completa para el cliente.

Me gustaría saber ¿por qué tengo una advertencia que hay y de cómo el código perfectamente con el fin de tener 0 advertencias. Si es posible me gustaría evitar el uso de «@SuppressWarnings(«unchecked»)». 😉

Gracias,

Luis

  • Enviar un arreglo sobre el zócalo, en lugar de una Colección. (MyVariable[]) ois.readObject() es un seguro de fundición. Para convertir una Colección para un conjunto de tipos, uso list.toArray(new MyVariable[0]). Para convertir una matriz a una Colección, utilice el Arrays.asList método.

5 Comentarios

  1. 21

    Probar este

    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.
          }
        }
      }
    }
  2. 13

    Es imposible evitar esta advertencia. readObject() devuelve un Objeto. Usted necesita para lanzarla. Y la conversión a un tipo genérico siempre va a generar una advertencia.

    Si quieres hacer el código lo más limpio posible, que es una buena idea, se debe respetar el Java convenciones de nomenclatura, sin embargo, y hacer de los nombres de las variables comienzan con una letra minúscula.

    • Estoy bastante seguro de que puede. ¿Mi respuesta te pierdas nada?
    • No devolver un List<MyVariable>, y es una exageración. El OP debe saber que un List<MyVariable> es lo que se envía.
  3. 2

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

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

    Y trabajar con MyVariableList lugar. De esa manera usted explícitamente proporcionar suficiente información para que el compilador para hacer la comprobación de tipos en tiempo de ejecución.

  4. 1

    Yo estaba corriendo en un problema similar, como OP y encontró una buena solución con una combinación de comentario de @VGR y Java 1.8 método de Matrices.

    Voy a dar mi respuesta en términos de OP de la pregunta, por lo que es genérico y esperemos que ayuda a los demás:

    1. Lugar de devolver una colección (lista) devuelve un array desde el servidor. Compilación de información en una matriz mediante el siguiente en el lado del servidor código:

      myVariableList.toArray(new MyVariable[0]);

      Si el rendimiento es un problema con la anterior, siguiente podría ser utilizado, de modo que la matriz no necesita ser redimensionada:

      myVariableList.toArray(myVariableList.size());

    2. Del lado del cliente convertir la matriz de objeto, a una matriz de Mivariable clase.

      Esto es específico de JAVA 8.

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

    3. Entonces, finalmente convertir la Matriz en una Colección (de la lista).

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

    Gracias.

  5. 0

    También corrí en una situación similar y fue capaz de resolverlo.
    Mi solución, aplicada al ejemplo de la OP es este:

    myList = (ArrayList<Someclass>) Arrays.asList( (Someclass[]) ois.readObject() );

    Me han cambiado la nomenclatura de las convenciones (como sugerido por alguien, ya) estándar de Java (objetos inician con minúscula caracteres) y he cambiado el nombre de la Clase MyVariable a Someclass hacer explícito, de que esto realmente se aplica a cualquier clase (y no sólo de las Variables). También estoy suponiendo, que el objeto correspondiente a myList en el lado del servidor de tipo ArrayList<Someclass> ha sido escrito para la corriente como una Matriz Someclass[]. Tenga en cuenta, que esto se puede hacer fácilmente y de forma análoga a la primera parte de lo que abhishek ya se ha sugerido, pero mi solución difiere en el último paso en la medida en que:

    1. Estoy evitando llamar Arrays.stream
    2. Es más fácil de leer y rápidamente se percibe como una simple (sin más lógica) y checked (no generar una advertencia) cast.

Dejar respuesta

Please enter your comment!
Please enter your name here