Как решить это предупреждение о безопасности типа Java? - PullRequest
11 голосов
/ 28 мая 2010
Map session = ActionContext.getContext().getSession();
session.put("user", user);

Этот код генерирует предупреждение: Тип безопасности: метод put (Object, Object) относится к необработанному типу Map. Ссылки на универсальный тип Map должны быть параметризованы .

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);

Этот код генерирует предупреждение: Тип безопасности: не проверяется приведение с карты на карту .

Метод getSession принадлежит Struts2, поэтому я не могу его изменить. Я хотел бы избежать использования @SuppressWarnings, потому что другие предупреждения могут быть полезны.

Я полагаю, что все пользователи Struts2 в мире сталкивались с одной и той же проблемой ... есть ли элегантное решение?

Ответы [ 7 ]

10 голосов
/ 28 мая 2010

Не думаю, что есть другой способ, кроме @SuppressWarnings («не проверено»). Я полагаю, что вы можете поместить его чуть выше рассматриваемой строки, и он будет только подавлять эту строку.

Изменить: вы также можете сделать Map<?, ?> session = ActionContext.getContext().getSession();, но я не уверен, насколько вы готовы сделать это; вы не сможете поместить что-либо в карту таким образом (поскольку компилятор не может проверить тип того, что вы помещаете), только читать из него.

4 голосов
/ 28 мая 2010

Самый безопасный и эффективный способ справиться с этим, вероятно:

Map<?, ?> session = ActionContext.getContext().getSession();

, а затем введите приведение объектов, извлеченных из карты сеанса.

Подход @SuppressWarnings фактически приведет к тому, что скомпилированный код будет идентичен. Однако приведение типа будет неявным; то есть это будет нелегко определить, посмотрев на исходный код. А аннотация @SuppressWarnings может (гипотетически) подавить некоторые другие предупреждения в том же блоке кода, который представляет собой реальную ошибку; то есть тот, который приведет к сбою одного из скрытых типов и т. д. во время выполнения.

Другие более дорогие альтернативы включают:

  • запись путем записи записи из Map<?, ?> в новый Map<String, Serializable> экземпляр, приводящий ключи и значения к String и Serializable соответственно или

  • универсальный метод, подобный следующему, который выполняет типобезопасность безопасно.


@SuppressWarnings("unchecked")
public <K,V> Map<K,V> castMap(Map<?, ?> map, Class<K> kClass, Class<V> vClass) {
    for (Map.Entry<?, ?> entry : map.entrySet()) {
        kClass.cast(entry.getKey());
        vClass.cast(entry.getValue());
    }
    return (Map<K,V>) map;
}
1 голос
/ 11 июля 2014

Он запрашивает у вас параметризацию значения, если значение нуждается в параметрах, тогда передайте их.

Например

Map<Integer, Map> vCombinedCodeMap = new HashMap<>();

выдаст предупреждение для «параметризованного» * ​​1006 *.

поэтому правильный формат следующий:

Map<Integer, Map<String, String>> vCombinedCodeMap = new HashMap<>();
1 голос
/ 28 мая 2010

Какую версию Struts 2 (особенно XWork) вы используете? Для меня ваш следующий код дает ошибку:

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);

Cannot cast from Map<String,Object> to Map<String,Serializable>.

Это, с другой стороны, работает и не дает предупреждений:

Map<String, Object> session = ActionContext.getContext().getSession();
0 голосов
/ 28 февраля 2019

просто напишите @SuppressWarnings("unchecked") в начале метода @GET, надеюсь, он вам поможет.

0 голосов
/ 20 марта 2015

В ролях следующим образом,

public void setSession(Map<String, Object> sessionMap) {

    // TODO Auto-generated method stub

    this.sessionMap = (SessionMap<String, Object>) sessionMap;
}
0 голосов
/ 28 мая 2010

Что если вы сделаете это так:

Map<String, Serializable> session = ActionContext.getContext().getSession();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...