Что означает предупреждение о безопасности типов в некоторых обобщенных приведениях Java?
-
08-06-2019 - |
Вопрос
В чем смысл Предупреждение Java?
Тип безопасности:Приведение объекта к List<Integer> фактически проверяет соответствие стертому типу List.
Я получаю это предупреждение, когда пытаюсь привести объект к типу с общей информацией, например, в следующем коде:
Object object = getMyList();
List<Integer> list = (List<Integer>) object;
Решение
Это предупреждение появляется потому, что Java фактически не сохраняет информацию о типе во время выполнения в объекте, использующем дженерики.Таким образом, если object
на самом деле это List<String>
, Здесь не будет ClassCastException
во время выполнения, за исключением случаев, когда из списка осуществляется доступ к элементу, который не соответствует универсальному типу, определенному в переменной.
Это может привести к дальнейшим осложнениям, если в список будут добавлены элементы с неверной информацией об общем типе.Любой код, все еще содержащий ссылку на список, но с правильной информацией об общем типе, теперь будет иметь противоречивый список.
Чтобы убрать предупреждение, попробуйте:
List<?> list = (List<?>) object;
Однако обратите внимание, что вы не сможете использовать определенные методы, такие как add, поскольку компилятор не знает, пытаетесь ли вы добавить объект неправильного типа.Вышеупомянутое будет работать во многих ситуациях, но если вам придется использовать add или какой-либо аналогичный ограниченный метод, вам просто придется столкнуться с желтым подчеркиванием в Eclipse (или SuppressWarning
аннотация).