Как избежать предупреждения о непроверенных конверсиях в Java, если вы используете устаревшие библиотеки? - PullRequest
26 голосов
/ 15 июля 2009

Мне нравится универсальная функция в Java, и я часто ее использую. Но у меня есть проблема, если я использую библиотеки, которые еще не знают об обобщениях. Примером являются сервлеты. Если вы используете ServletRequest.getParameterMap(), результатом будет необработанная карта, но она будет содержать только String в качестве ключей и String[] в качестве значений. Поэтому я хочу присвоить его Map<String, String[]>. Но за это задание я получаю предупреждение. Как можно избежать этого предупреждения с помощью языка, а не просто подавить предупреждение с помощью аннотации @SuppressWarnings.

Ответы [ 7 ]

41 голосов
/ 15 июля 2009

Как уже говорили другие, предупреждений нельзя избежать, кроме как путем их подавления. ИМХО проблема в том, что либо вы должны засорять свой код аннотациями, которые применяются к небольшому объему, либо игнорировать их глобально и создавать ошибки.

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

Между тем, я думаю, что лучший подход - использовать метод-обертку, чтобы предупреждения были ограничены одним местом, где их можно игнорировать:

class NoWarn {
  public static Map<String, String[]> getParameterMap(ServletRequest r) 
  {
    @SuppressWarnings("unchecked")
    Map<String, String[]> result = r.getParameterMap();
    return result;
  }
}

Примечание Этот ответ был отредактирован с комментарием о том, что аннотации не могут быть внутри тела метода. Это неверно, вышеизложенное является синтаксически правильным. Я отменил изменения.

8 голосов
/ 15 июля 2009

Самое чистое, что вы можете сделать, это инкапсулировать преобразование из унаследованного в общий код и подавить предупреждение только там.

например. Вы могли бы создать общий вид в своей устаревшей библиотеке, хотя это не всегда стоит.

2 голосов
/ 15 июля 2009

Как я могу избежать этого предупреждения с язык, а не просто подавляя предупреждение с SuppressWarnings-аннотации.

Аннотация - это способ избежать предупреждения на языке. Другого пути нет.

1 голос
/ 22 сентября 2014

Наткнулся на этот вопрос, так как я также пытался найти способ избежать использования аннотации подавления в таких случаях. Я нашел другую альтернативу, о которой я думал, стоит упомянуть:

    Map<?, ?> map = servletRequest.getParameterMap();
    String[] values = (String[]) map.get("key");

Мы в основном используем подстановочный знак '?' чтобы указать, что карта может иметь любой тип ключа и значения.

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

1 голос
/ 15 июля 2009

У меня была такая же проблема, я просто отключил все общие предупреждения, и я счастлив :) Вы также можете отключить предупреждение serialVersionUID, так как многие люди не используют serialVersionUID.

в Eclipse - Окно / Настройки / Java / Компилятор / Ошибки / Предупреждения и отключите все общие типы.

P.S. Многие плохие предупреждения заставляют вас игнорировать все предупреждения, а некоторые могут быть полезны.

1 голос
/ 15 июля 2009

Не думаю, что ты можешь. Предупреждение появится, если вы не подавите его или не отфильтруете его из списка предупреждений IDE.

0 голосов
/ 11 марта 2013

как говорили другие, единственный способ избавиться от этого предупреждения - это подавить его.

Рекомендуется инкапсулировать предупреждение с использованием методов и классов.

но с другими предупреждениями всегда пытайтесь решить проблему, которая их создает, например, удалить неиспользуемый импорт и т. Д. ... это делает ваше приложение более гибким и улучшенным.

счастливое кодирование

...