Como faço para voltar List a partir de um método onde eu mandei colocar (Object) em um mapa (exemplo tem)

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

Pergunta

Eu tenho o seguinte 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);
}

A idéia de ser capaz de enviar todos os objetos em um mapa e depois recuperá-lo, mas como faço para resolver o genereics-parte em java?

Aqui está um exemplo de código. Aqui eu salvar a lista no mapa:

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

    list.add("a string");

    session.set(KEY.LIST, list);

Agora eu quero obter a lista novamente:

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

Mas agora eu recebo um

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

erro por razões óbvias.

É possível obter uma lista (String) do método, sem quaisquer typecasts? este método está correto?

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

Solução

Outra opção para superar tipo de apagamento * é passar uma referência para a classe de objeto que você está esperando no retorno.

Você também tem a chance de fazer algum tipo de verificação.

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;
}

Você chamaria isso como:

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

* pelo menos superar tipo de rasura na declaração do método. Você ainda tem que fazer algum vazamento no corpo do método.

Outras dicas

Você não pode resolver isso por causa da digite apagamento . O melhor que você pode fazer é suprimir o aviso, se você tem certeza absoluta de que o elenco não pode dar errado.

O elenco você deu irá gerar um aviso, porque não é realmente verificar outra coisa senão que getObj retorna um List. Na verdade, não há nada que você pode realmente verificar de forma eficiente, devido a tipo de apagamento -. em tempo de execução, você terá uma List que acontece de conter cordas, mas isso é tudo

Você certamente poderia verificar que tudo na lista é a string (ou nulo), mas isso é uma operação O (n). Ou você poderia apenas fazer o elenco, suprimir o aviso e esperança ... caso em que você só terá uma exceção se e quando você bate um não-string.

Você poderia tentar um MultiMap. Você pode armazenar vários valores por chave. Google tem um implementação . apache commons, provavelmente, tem uma implementação também.

Em vez de colocar um List na sessão, introduzir um tipo que faz sentido no domínio do aplicativo. Por exemplo, em vez de List<LineItem>, uso Order:

public final class Order {
    private final List<LineItem> lineItems;
    [...]
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top