2010-06-22 23 views
5

tengo dos clases de Java como:ClassCastException

class A { 

int a=10; 

public void sayhello() { 
System.out.println("class A"); 
} 
} 

class B extends A { 

int a=20; 

public void sayhello() { 
System.out.println("class B"); 
} 

} 

public class HelloWorld { 
    public static void main(String[] args) throws IOException { 

B b = (B) new A(); 
    System.out.println(b.a); 
    } 
} 

en tiempo de compilación no da error, pero en tiempo de ejecución se muestra un error: Excepción en hilo java.lang.ClassCastException "principal": Un no se puede convertir a B

Respuesta

16

Esto sucede porque el de tiempo de compilación tipo expresión de new A() es A - que podría ser una referencia a una instancia de B, por lo que se permite que el fundido.

En el momento de la ejecución, sin embargo, la referencia es solo a una instancia de A, por lo que falla el reparto. Una instancia de solo Ano es una instancia de B. El elenco solo funciona si la referencia realmente se refiere a una instancia de B o una subclase.

7

B extiende A y, por lo tanto, B se puede convertir en A. Sin embargo, lo contrario no es cierto. Una instancia de A no se puede convertir como B.

Si viene del mundo Javascript, puede esperar que esto funcione, pero Java no tiene "duck typing".

1

Primera hacerlo así:

A aClass = new B(); 

Ahora Haga su conversión explícita, que funcionará:

B b = (B) aClass; 

fundición expreso de la media debe necesitar la conversión implícita. elsewise Explicit casting no está permitido.

0

Una vez que crea el objeto de una clase secundaria no puede encasillarlo en una superclase. Basta con mirar en los siguientes ejemplos

supuestos: perro es la clase de niño que hereda de los Animales (SuperClass)

normal Typecast:

Dog dog = new Dog(); 
Animal animal = (Animal) dog; //works 

incorrecto Typecast:

Animal animal = new Animal(); 
Dog dog = (Dog) animal; //Doesn't work throws class cast exception 

La continuación Typecast realmente funciona:

Dog dog = new Dog(); 
Animal animal = (Animal) dog; 
dog = (Dog) animal; //This works 

Un compilador comprueba la sintaxis es durante el tiempo de ejecución contenidos en realidad están verificados

Cuestiones relacionadas