¿Cómo devuelvo List < String > de un método donde envié para poner (Objeto) en un mapa (ejemplo obtenido)

StackOverflow https://stackoverflow.com/questions/1422448

Pregunta

Tengo el siguiente código

private Map<KEY, Object> values = new HashMap<KEY, Object>();

public void set(KEY key, Object value) {
    values.put(key, value);
}

private Object getObj(KEY key) {
    return values.get(key) == null ? key.getDefaultValue() : values.get(key);
}

public List<E> getList(KEY key) {
    return (List<E>) getObj(key);
}

La idea de poder enviar cualquier Objeto en un mapa y luego recuperarlo, pero ¿cómo resuelvo la parte genética en Java?

Aquí hay un código de ejemplo. Aquí guardo la Lista en el mapa:

    List<String> list = new ArrayList<String>();

    list.add("a string");

    session.set(KEY.LIST, list);

Ahora quiero volver a obtener la Lista:

List<String> list = session.getList(KEY.LIST);

Pero ahora obtengo un

cannot convert from List<E> to List<String>

error por razones obvias.

¿Es posible obtener una Lista (Cadena) del método, sin ningún tipo de conversión? ¿Es correcto este método?

public List<E> getList(KEY key) {
    return (List<E>) getObj(key);
}
¿Fue útil?

Solución

Otra opción para superar el borrado de tipo * es pasar una referencia a la clase de objeto que espera en el retorno.

También tienes la oportunidad de hacer algún tipo de verificación.

public <E> List<E> getList(KEY key, Class<? extends E> elementClass)
{
  Object o = getObj(key);
  if ( ! (o instanceof List) ) throw new RuntimeException("Not a list value");
  List l = (List)o;
  if ( l.size() > 0 && !elementClass.isAssignableFrom( l.get(0) ) ) throw new RuntimeException("List element not valid type");

  return (List<E>)l;
}

Llamarías esto como:

List<String> list = session.getList(KEY.LIST, String.class);

* al menos superar el borrado de tipo en la declaración del método. Todavía tiene que hacer algunos cambios en el cuerpo del método.

Otros consejos

No puede resolver eso debido a tipo de borrado . Lo mejor que puede hacer es suprimir la advertencia, si está absolutamente seguro de que el elenco no puede salir mal.

El elenco que ha dado generará una advertencia, porque no es realmente verificar nada más que getObj devuelve una List . De hecho, no hay nada que pueda realmente verificar eficientemente, debido a borrado de tipo : en el momento de la ejecución, tendrá una List que contiene cadenas, pero eso es todo.

Ciertamente podría comprobar que todo en la lista es una cadena (o nula), pero esa es una operación O (n). O simplemente puede hacer el reparto, suprimir la advertencia y la esperanza ... en cuyo caso solo obtendrá una excepción si golpea una no cadena.

Puedes probar un MultiMap. Puede almacenar múltiples valores por clave. Google tiene una implementación . Apache commons probablemente también tenga una implementación.

En lugar de poner una List en la sesión, introduzca un tipo que tenga sentido en el dominio de la aplicación. Por ejemplo, en lugar de List < LineItem > , use Order :

public final class Order {
    private final List<LineItem> lineItems;
    [...]
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top