2010-04-20 18 views
7

Estoy aprendiendo acerca de los tipos estáticos frente a los dinámicos, y estoy al punto de entenderlo en su mayor parte, pero este caso todavía me escapa.Fundición y tipo dinámico vs estático en Java

Si la clase B extiende A, y tengo:

A x = new B(); 

es la siguiente permitidas ?:

B y = x; 

O es conversión explícita requiere ?:

B y = (B) x; 

Gracias!

Respuesta

15

Explicit casting es required, and succeed.

La razón por la que se necesita es porque no siempre éxito: una variable declarada como A x puede referirse a casos que no son instanceof B.

// Type mismatch: cannot convert from Object to String 
Object o = "Ha!"; 
String s = o; // DOESN'T COMPILE 

// Compiles fine, cast succeeds at run-time 
Object o = "Ha!"; 
String s = (String) o; 

// Compiles fine, throws ClassCastException at run-time 
Object o = Boolean.FALSE; 
String s = (String) o; 

Sea o no un elenco que se requiere es determinado únicamente por los tipos declarados de las variables que intervienen, NO por los tipos de los objetos que se están refiriendo a en tiempo de ejecución. Esto es cierto incluso si las referencias se pueden resolver en tiempo de compilación.

final Object o = "Ha!"; 
String s = o; // STILL doesn't compile!!! 

Aquí, a pesar de que la variable finalo se referirá siempre a un instanceof String, su tipo declarado sigue siendo Object, y por lo tanto una explícita (String) reparto es todavía necesario para compilar.

+0

Muchas gracias. Lo entiendo completamente ahora. – XpdX

+1

@XpdX: entonces debes aceptar esto como la respuesta correcta. –

Cuestiones relacionadas