¿Dónde y cómo se realizan realmente las conversiones de referencia amplias?
En la especificación de lenguaje de Java (JLS), dice lo siguiente:
Una conversión de tipo de
Thread
a tipoObject
no requiere ninguna acción en tiempo de ejecución;Thread
es una subclase deObject
, por lo que cualquier referencia producida por una expresión de tipoThread
es un valor de referencia válido de tipoObject
.
He escrito un ejemplo como se muestra a continuación:
Thread myThread = new Thread();
Object myObject = myThread;
Según mi entendimiento, una conversión significa que un tipo se convierte realmente en otro tipo. ¿Cuál de los siguientes argumentos es correcto?
1.
El compilador inserta implícitamente una conversión ascendente en tiempo de compilación. En tiempo de ejecución, la conversión de
Thread
aObject
se lleva a cabo, por lo que ambos tipos de los dos operandos del operador = son de tipoObject
.
2.
El compilador inserta implícitamente una conversión de identidad en tiempo de compilación. En tiempo de ejecución, la conversión de
Thread
aThread
se lleva a cabo, aunque los tipos de los dos operandos del operador = no son iguales, son compatibles entre sí.
davy.ai
Basándose en la información proporcionada en el JLS, el argumento correcto es la opción 1: el compilador inserta implícitamente un “up-cast” en tiempo de compilación. En tiempo de ejecución, la conversión de
Thread
aObject
se lleva a cabo, por lo que ambos tipos de los dos operandos del operador=
son de tipoObject
. Esto se debe a que una conversión de tipoThread
a tipoObject
no requiere ninguna acción en tiempo de ejecución porqueThread
es una subclase deObject
. Por lo tanto, la referencia producida por una expresión de tipoThread
se puede asignar directamente a una variable de tipoObject
.