Точные детали, конечно, зависят от архитектуры.
Приведение примитивов и объектов в значительной степени не связано.
Для примитивных преобразований может потребоваться переместить значения между целыми числамии регистры с плавающей запятой или для расширения знака, но это, как правило, чрезвычайно быстрые операции, уменьшенные по времени доступа к памяти.
Объекты разные.
Компилятор bytecode-> native может доказать, чтопреобразование объекта всегда завершается успешно, поэтому во время выполнения никаких действий не происходит.
Обычно при успешном checkcast
накладных расходов производительности практически нет.Существуют различные оптимизации (для которых где-то может быть разумное руководство).Большинство оптимизаций необходимы, даже если вы просто хотите эффективно вызывать виртуальный метод.Кроме того, дженерики - это просто «выдумка компилятора», поэтому неявные приведения очень распространены.В прежние времена абстрактные классы могли быть предпочтительнее интерфейсов из-за более простой отправки виртуальных методов, но никто не заботился о них двадцать лет.
В вашем примере кода приведение может показывать, что оно всегда выполняется успешно.В противном случае, поскольку String
является окончательным, единственной необходимой проверкой является правильность информации о типе в заголовке объекта.Дальнейший доступ к памяти не требуется.