Каково значение предупреждения о безопасности типа в некоторых приведениях Java generics?


в чем смысл Java warning?

тип безопасности: приведение от объекта к списку фактически проверяет против стертого списка типов

Я получаю это предупреждение, когда я пытаюсь привести объект к типу с общей информацией, например, в следующем коде:

Object object = getMyList();
List<Integer> list = (List<Integer>) object;
1 63

1 ответ:

это предупреждение существует, потому что Java фактически не хранит информацию о типе во время выполнения в объекте, который использует универсальные шаблоны. Таким образом, если object на самом деле List<String> не будет ClassCastException во время выполнения, за исключением тех случаев, когда доступ к элементу из списка не соответствует универсальному типу, определенному в переменной.

Это может привести к дальнейшим осложнениям, если элементы добавляются в список с этой неверной информацией общего типа. Любой код по-прежнему содержит ссылку на список, но с правильной информацией общего типа теперь будет иметь несогласованный список.

чтобы удалить предупреждение, попробуйте:

List<?> list = (List<?>) object;

однако обратите внимание, что вы не сможете использовать определенные методы, такие как add, потому что компилятор не знает, пытаетесь ли вы добавить объект неправильного типа. Вышеизложенное будет работать во многих ситуациях, но если вам нужно использовать add или какой-то аналогичный ограниченный метод, вам просто придется страдать от желтого подчеркивания в Eclipse (или а SuppressWarning аннотация).