Дженерики в Java избегают всего ClassCastExceptins?

C#

  • мне жаль, что я не мог switch() ни на каком типе, и что case могло быть любое выражение.

  • не Может использовать объектный синтаксис инициализатора с полями 'только для чтения' / private set автоопоры. Обычно я хочу справку языка с созданием неизменных типов.

  • Использование {} для [1 120] метод класса и пространства имен и и блоки свойства/индексатора и составные блоки и инициализаторы массива . Мешает выяснять, где Вы - когда они далеко друг от друга или не соответствовавшие.

  • я очень не хочу писать (from x in y ... select).Z(). Я не хочу должным быть отступать к синтаксису вызова метода, потому что синтаксис запроса пропускает что-то.

  • я хочу do пункт на синтаксисе запроса, который похож foreach. Но это не действительно запрос затем.

я действительно достигаю здесь. Я думаю, что C# является фантастическим, и трудно найти много, это повреждается.

6
задан Robert Munteanu 9 February 2010 в 23:11
поделиться

4 ответа

Прежде всего, вы должны убедиться, что ваш код компилируется без предупреждений об отключении. Это хороший показатель. Чтобы понять, почему, я предлагаю вам взглянуть на пример главы для дженериков из Effective 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 , просто правильно используя дженерики .

12
ответ дан 8 December 2019 в 03:27
поделиться

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

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

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

(Хороший справочник по этому и другим вопросам универсальных типов - Java Generics and Collections . )

16
ответ дан 8 December 2019 в 03:27
поделиться

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

-1
ответ дан 8 December 2019 в 03:27
поделиться

Нет. Использование Java 5.0 и обобщенного типа не делает вас защищенным от ClassCastException.

2
ответ дан 8 December 2019 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: