Избегают ли дженерики в Java всех ClassCastExceptins?
-
16-09-2019 - |
Вопрос
Поскольку дженерики проверяются только во время компиляции с Java 5, могут ли они избежать ClassCastExceptions во всех ситуациях?
Решение
Прежде всего, вы должны убедиться, что ваш код компилируется без необработанных предупреждений.Это хороший показатель.Чтобы понять почему, я предлагаю вам взглянуть на пример главы для дженериков из эффективной Java.
Во-вторых, дженерики не могут защитить вас от такого кода, как:
public void methodOne(Integer argument) {
methodTwo(argument);
}
public void methodTwo(Object argument) {
System.out.println(((Date) argument).getTime());
}
В-третьих, если вы тем или иным образом возитесь с загрузчиками классов, вам может показаться странным ClassCastExceptions
, например , в эта тема обсуждения.Это ошеломляющее зрелище
java.lang.ClassCastException:javax.mail.Session не может быть преобразован в javax.mail.Session
Итак, ответ таков нет, ты не можешь избавиться от ClassCastException
s просто путем правильного использования дженериков.
Другие советы
"Железная" гарантия, которую предоставляют Java 5 generics, заключается в том, что вы никогда не увидите ClassCastException из приведений, вставленных компилятором предоставленный эта компиляция не выдала никаких "непроверенных" предупреждений.
В реальной жизни вы часто не можете избежать непроверенных предупреждений, если в вашем коде используются устаревшие (негенерифицированные) библиотеки.Затем сгенерированные компилятором приведения может бросьте ClassCastException, и ваша задача - предотвратить это, убедившись, что значения, возвращаемые библиотечным кодом, правильно типизированы для ваших объявлений.
В остальном ситуация остается неизменной.Помимо дженериков, если вы приведете к несовместимому типу, вы получите ClassCastException так же, как и всегда.
(Хорошей ссылкой на этот и другие общие вопросы является Дженерики и коллекции Java.)
Нет.Использование Java 5.0 и generics type не делает вас защищенным от ClassCastException.
Нет.дженерики спасают вас только от ошибок во время компиляции, а не от исключений во время выполнения.