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