Нет способа избежать этого предупреждения.Создание массива позволяет использовать только необработанные типы в качестве типа элемента.Я уверен, что есть причина, по которой эксперты по Java решили не допускать там дженерики, но я не знаю этой причины.
Так что, если вы действительно хотите массив Map<String,Object>
элементов (и по какой-то причиневместо этого нельзя использовать List
), вы можете объявить переменную с этим универсальным типом, но вы всегда получите это предупреждение при сохранении только что созданного массива, поскольку он может иметь только необработанный тип.
Но это только предупреждение, и ваш код будет работать отлично.Это предупреждение, а не ошибка, означающее, что есть что-то, что требует внимания разработчика, поскольку компилятор не может решить, нормально это или нет.
Так в чем же проблема, вызывающая предупреждение?
Во время выполнения Map<String,Object>[]
- это просто Map[]
, так как универсальные типы стираются во время компиляции.Таким образом, создание массива дает правильный тип времени выполнения массива, и вы не получите ClassCastException
из этого назначения.Проверка общих правил выполняется только во время компиляции: обязанность компилятора - убедиться, что переменная времени выполнения Map[]
, назначенная переменной Map<String,Object>[]
, содержит только карты, в которых строки используются в качестве ключей, а объекты в качестве значений (и, конечно, null
значения также допустимы в качестве элементов массива.)
Теперь, если вы присваиваете значение Map[]
времени компиляции переменной Map<String,Object>[]
,
Map[] rawArray = ...;
Map<String,Object>[] generic Array = rawArray;
Компилятор не знает, какие типы ключей и значений используют карты, содержащиеся в rawArray
, поэтому он справедливо предупреждает вас об этом риске несовместимости типов.Но в случае только что созданного new Map[n]
,
Map<String,Object>[] genericArray = new Map[5];
компилятор просто недостаточно интеллектуален, чтобы видеть, что этот массив содержит только свои начальные значения null
, и, таким образом, полностью соответствует Map<String,Object>[]
требования.Это утверждение на самом деле не содержит какого-либо риска, связанного с типами, просто компилятор недостаточно умен, чтобы его понимать.
Поэтому я рекомендую либо игнорировать предупреждение, либо размещать соответствующую аннотацию @SuppressWarnings
,комментируя, почему оправдано подавление предупреждения.Жаль, что мы не можем применить аннотацию @SuppressWarnings
к отдельному оператору, поэтому вы можете реорганизовать создание массива в собственный метод, поэтому аннотация @SuppressWarnings
применяется только к этому действию, а не к вашему.весь метод.