Как избежать предупреждения без предупреждения в Java, если вы используете устаревшие библиотеки?

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

в Eclipse - Window/Perferences/Java/Compiler/Errors/Warnings и отключить все общие типы.

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

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