Не могли бы вы объяснить, как работает литье (в памяти)?
Он работает на уровне байтового кода, который в действительности не находится в памяти
Как изменяется тип переменной при повышении или понижении?
Если это примитив со специальной инструкцией байт-кода, например от длинного к целому, как в:
long l = ...
int i = ( int ) l;
Байт-код: l2i
if является ссылкой с инструкцией checkcast
Откуда JVM знает, что с этого времени безопасно отправлять этот метод этому объекту?
Это не так, он пытается сделать это во время выполнения, и, если это не удается, выдает исключение.
Допустимо написать:
String s = ( String ) new Date();