Реализация Java Casting - PullRequest
       35

Реализация Java Casting

4 голосов
/ 04 мая 2011

Я знаю, как использовать приведение в Java, но у меня есть более конкретный вопрос;Не могли бы вы объяснить мне, как работает литье (в памяти)?

  • Как изменяется тип переменной при повышении или понижении?

  • Как JVM узнает, что этот метод можно безопасно отправить этому объекту?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 04 мая 2011

Не могли бы вы объяснить, как работает литье (в памяти)?

Он работает на уровне байтового кода, который в действительности не находится в памяти

Как изменяется тип переменной при повышении или понижении?

Если это примитив со специальной инструкцией байт-кода, например от длинного к целому, как в:

long l = ...
int i = ( int ) l;

Байт-код: l2i if является ссылкой с инструкцией checkcast

Откуда JVM знает, что с этого времени безопасно отправлять этот метод этому объекту?

Это не так, он пытается сделать это во время выполнения, и, если это не удается, выдает исключение.

Допустимо написать:

String s = ( String ) new Date();
3 голосов
/ 04 мая 2011

Возможный дубликат принятого ответа на этот вопрос: Как работает оператор Java Cast?

Здесь также есть довольно подробное объяснение, которое охватывает все типы данных и т. Д .:http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5

1 голос
/ 04 мая 2011

Все приведение примитивов выполняется в регистрах (как и большинство операций). Во многих случаях при примитиве при понижении принимаются младшие биты, а при приведении вверх знак расширяется. Есть крайние случаи, но вам обычно не нужно знать, что это такое.


Повышение / понижение ссылки работает так же, как и проверка того, что реальный объект является экземпляром того типа, который вы приведете к типу. Вы можете разыгрывать заклинания, которые не являются ни повышенными, ни понижающими.

, например

 Number n = 1;
 Comparable c = (Comparable) n; // Number and Comparable are unrelated.
 Serializable s = (Serializable) c; // Serializable and Comparable are unrelated.
0 голосов
/ 04 мая 2011

Если вас интересует внутренняя работа jvn относительно того, как работает приведение типов, вы также можете проверить спецификацию jvm http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#25611

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...