Избегают ли дженерики в 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.почта.Сеанс

Итак, ответ нет, вы не можете избавиться от ClassCastExceptions просто правильно используя дженерики.


гарантия "чугуна", которую предоставляет Java 5 generics, заключается в том, что вы никогда не увидите исключение ClassCastException из приведений, вставленных компилятором предоставил эта компиляция не вызвала" непроверенных " предупреждений.

в реальной жизни вы часто не можете избежать непроверенных предупреждений, если ваш код использует устаревшие (не генерированные) библиотеки. Затем генерируемые компилятором касты can throw ClassCastException, и это ваша работа, чтобы предотвратить это, гарантируя, что значения, возвращаемые кодом библиотеки, хорошо типизированы для объявлений.

в противном случае ситуация не изменится. Вне дженериков, если вы приведете к несовместимому типу, вы получите ClassCastException так же, как и всегда.

(хорошей ссылкой для этого и других вопросов дженериков является Java дженерики и коллекции.)


нет. Использование Java 5.0 и типа generics не делает вас ClassCastException-proof.


Неа. дженерики спасают вас только от ошибок времени компиляции, а не от исключений времени выполнения.