Как вернуть список < String > из метода, куда я отправил положить (Object) на карту (получил пример)

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

Вопрос

У меня есть следующий код

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

Идея в том, чтобы иметь возможность отправлять любые объекты на карте и затем извлекать ее, но как мне решить составную часть в java?

Вот пример кода. Здесь я сохраняю Список на карте:

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

    list.add("a string");

    session.set(KEY.LIST, list);

Теперь я хочу снова получить список:

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

Но теперь я получаю

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

ошибка по понятным причинам.

Можно ли получить метод List (String) без каких-либо типов? Этот метод правильный?

public List<E> getList(KEY key) {
    return (List<E>) getObj(key);
}
Это было полезно?

Решение

Еще один вариант преодоления стирания типа * - передать ссылку на класс объекта, который вы ожидаете получить.

У вас также есть возможность проверить некоторые типы.

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

Вы бы назвали это так:

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

* хотя бы преодолеть стирание типа в объявлении метода. Вам все еще нужно выполнить приведение в теле метода.

Другие советы

Вы не можете решить эту проблему из-за стирания типа . Лучшее, что вы можете сделать, это подавить предупреждение, если вы абсолютно уверены, что приведение не может пойти не так.

Приведенный вами акт будет генерировать предупреждение, потому что действительно не проверяет ничего, кроме того, что getObj возвращает List . На самом деле, вы можете действительно ничего не проверять из-за стирание типа - во время выполнения у вас будет список , в котором содержатся строки, но это все.

Конечно, вы можете проверить, что все в списке является строкой (или нулем), но это операция O (n). Или вы можете просто выполнить приведение, подавить предупреждение и надежду ... в этом случае вы получите исключение, только если вы нажмете не строку.

Вы можете попробовать MultiMap. Вы можете хранить несколько значений для каждого ключа. У Google есть реализация . , Apache commons, вероятно, также имеет реализацию.

Вместо помещения List в сеанс введите тип, который имеет смысл в области приложения. Например, вместо List < LineItem > используйте Order :

public final class Order {
    private final List<LineItem> lineItems;
    [...]
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top