Непроверенная операция Java приведена к универсальному - PullRequest
4 голосов
/ 18 октября 2011

Мне интересно, почему следующие сообщения выдают предупреждение о небезопасной / непроверенной операции:

Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");

Правильный ли состав? Я не могу понять, чего мне здесь не хватает.

P.S. Я не хочу избавляться от предупреждения, я хочу понять небезопасную операцию.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 18 октября 2011

Это означает, что приведение проверит, что возвращенный объект является Map некоторого вида, но он не сможет ничего проверить на предмет его содержимого из-за стирания типа . Во время выполнения карта - это карта, это карта ... поэтому, если кто-то вставит Map<Integer, String> в ваш сеанс, эта строка кода все равно будет успешной. Вы получите сообщение об ошибке только при попытке использовать одну из записей, например, перебирая записи и выбирая ключ и значение.

Добро пожаловать в дурацкий мир дженериков Java: (

1 голос
/ 18 октября 2011

Это непроверенный актерский состав. Вы, как программист, можете знать, что se.getSession (), как ожидается, будет именно этого типа с <String, ProxySession> параметрами, поэтому вы выполняете приведение, но это может быть не тот точный тип (предлагает компилятор). Поскольку вы не проверяете это программно, компилятор предупреждает вас.

См. Также: Как обращаться с непроверенными предупреждениями о приведении?

0 голосов
/ 18 октября 2011

JVM не проверяет такие приведения.Например, (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute"); будет равно (Map) se.getSession().getServletContext().getAttribute("myattribute");

...