Это первый обычай. Для этого требуется, чтобы тип, который был введен, был известен во время компиляции. Он проверяет во время компиляции, что литой может быть, является правильным и проверяет (если тип для отливки не является общим), что литой является правильным во время выполнения.
Второй использует отражение api. Для этого требуется, чтобы класс, который был запущен, был известен во время выполнения. Во время компиляции он ничего не проверяет, но всегда проверяет правильность исполнения при выполнении.
Параметры типа известны только при компиляции, поэтому вы не можете использовать второй подход для параметра типа (выражение T.class
не компилируется).
Динамически загруженные классы (например, с Class.forName (String)) известны только во время выполнения, поэтому первый подход не может быть использован.
Редактировать: Однако, как отмечает Павел, нет смысла бросать в динамически загруженный класс. Я согласен с тем, что единственная реальная полезность Class.cast(Object)
заключается в том, чтобы использовать для параметра типа, для которого у вас есть объект класса.
Если тип отливки не содержит параметр типа, то первый подход лучше, так как дополнительная проверка времени компиляции может ловить ошибки, вы не теряете безопасность типа во время выполнения и получаете более короткий синтаксис для загрузки.
ОК, так что я просто понял, что вы можете использовать 'cast' бросить в обертку примитивного типа. Например. 'Integer i = int.class.cast (" 1234 ");' –
@simmbot: вы можете _write_ это, но он не будет делать то, что вы, скорее всего, думаете, что оно делает. Попробуй. –
Это вызовет исключение ClassCastException, поскольку String не имеет тип Integer. В этом случае вам понадобится «Integer.valueOf (« 1234 »)». –