Supóngase que se desea emitir d objeto a A,
A a = (C) d;
Así que internamente 3 reglas han sido comprobadas por el compilador y JVM. El compilador comprueba las 2 primeras reglas en Tiempo de compilación y JVM comprobará la última regla en tiempo de ejecución.
Regla 1 (Tiempo de compilación comprobación):
tipo de 'd' y C debe tener alguna relación (hijo a padre o padre a hijo o mismo tiempo) .Si no hay relación entonces obtendremos un error de compilación (tipos inconvertibles).
Regla 2 (Compilar tiempo comprobando):
'C' debe ser o bien mismo tipo o tipo derivado (subclase) de 'A' si no conseguir un error de compilación (incompatible tipos).
Regla 3 (Excepción Runtime):
Runtime tipo de objeto de 'd' debe ser igual o derivado un tipo de 'C' lo contrario obtendremos una excepción de tiempo de ejecución (ClassCastException Excepción).
Búsqueda siguientes ejemplos para obtener más idea,
String s = new String("hello"); StringBuffer sb = (StringBuffer)s; // Compile error : Invertible types because there is no relationship between.
Object o = new String("hello"); StringBuffer sb = (String)o; // Compile error : Incompatible types because String is not child class of StringBuffer.
Object o = new String("hello"); StringBuffer sb = (StringBuffer)o; // Runtime Exception : ClassCastException because 'o' is string type and trying to cast into StingBuffer and there is no relationship between String and StringBuffer.
En qué situación es lo que realmente necesita para convertirse explícitamente un objeto a su tipo de interfaz? – harto
Tiene una respuesta muy útil aquí. Desearía que lo seleccionaras. – orbfish