namednativequery - Implementación de conversión de Java
native query example (4)
Sé cómo usar casting en Java pero tengo una pregunta más específica; ¿podría explicarme cómo funciona el casting (en memoria)?
¿Cómo se modifica el tipo de variable en la transmisión ascendente y descendente?
¿Cómo sabe la JVM que es seguro enviar este método a este objeto?
Gracias de antemano.
¿Podría explicarme cómo funciona el casting (en memoria)?
Funciona al nivel de código de bytes que realmente no está en la memoria
¿Cómo se cambia el tipo de variable en upcasting y downcasting?
Si es una primitiva con una instrucción especial de bytecode, por ejemplo de largo a entero como en:
long l = ...
int i = ( int ) l;
El bytecode es: l2i
si es una referencia con la instrucción checkcast
¿Cómo sabe la JVM que a partir de este momento es seguro enviar este método a este objeto?
No lo hace, intenta hacerlo en tiempo de ejecución y si falla arroja una excepción.
Es legal escribir:
String s = ( String ) new Date();
Posible duplicado de la respuesta aceptada a esta pregunta: ¿Cómo funciona el operador de elenco de Java?
También hay una explicación bastante extensa aquí, que cubre todos los tipos de datos, etc .: http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5
Si está interesado en el funcionamiento interno de jvn con respecto a cómo funcionan los moldes, también puede consultar la especificación jvm http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#25611
Todas las operaciones de fundición de primitivas se realizan en registros (como la mayoría de las operaciones). Para primitivas, en muchos casos, cuando se realiza el down-casting, se toman los bits más bajos y para el up-casting, el signo se extiende. Hay casos límite, pero generalmente no necesita saber cuáles son.
upcasting / downcasting una referencia funciona igual ya que comprueba que el objeto real es una instancia del tipo al que se lanza. Puedes lanzar lo cual no es ni upcast ni down cast.
p.ej
Number n = 1;
Comparable c = (Comparable) n; // Number and Comparable are unrelated.
Serializable s = (Serializable) c; // Serializable and Comparable are unrelated.