Избегают ли дженерики в Java всех ClassCastExceptins?
поскольку дженерики проверяются только во время компиляции с Java 5, Могут ли они избежать ClassCastExceptions во всех ситуации?
4 ответов
прежде всего, вы должны убедиться, что ваш код компилируется без предупреждений unckeched. Это хороший показатель. Чтобы понять почему, я предлагаю вам взглянуть на пример главы для дженериков из эффективной Java.
во-вторых, дженерики не могут защитить вас от кода, такого как:
public void methodOne(Integer argument) {
methodTwo(argument);
}
public void methodTwo(Object argument) {
System.out.println(((Date) argument).getTime());
}
В-третьих, если вы так или иначе возитесь с загрузчиками классов, вы можете получить странный ClassCastExceptions
, например эта дискуссия нить. Это умопомрачительно видеть
java.ленг.ClassCastException: javax.почта.Сеанс не может быть приведен к класса javax.почта.Сеанс
Итак, ответ нет, вы не можете избавиться от ClassCastException
s просто правильно используя дженерики.
гарантия "чугуна", которую предоставляет Java 5 generics, заключается в том, что вы никогда не увидите исключение ClassCastException из приведений, вставленных компилятором предоставил эта компиляция не вызвала" непроверенных " предупреждений.
в реальной жизни вы часто не можете избежать непроверенных предупреждений, если ваш код использует устаревшие (не генерированные) библиотеки. Затем генерируемые компилятором касты can throw ClassCastException, и это ваша работа, чтобы предотвратить это, гарантируя, что значения, возвращаемые кодом библиотеки, хорошо типизированы для объявлений.
в противном случае ситуация не изменится. Вне дженериков, если вы приведете к несовместимому типу, вы получите ClassCastException так же, как и всегда.
(хорошей ссылкой для этого и других вопросов дженериков является Java дженерики и коллекции.)
Неа. дженерики спасают вас только от ошибок времени компиляции, а не от исключений времени выполнения.