2010-06-22 10 views
5

ho due classi Java come: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); 
    } 
} 

al momento della compilazione non dà errore, ma in fase di esecuzione visualizza un errore: Exception in thread "main" java.lang.ClassCastException: A non può essere gettato a B

risposta

16

Questo accade perché la fase di compilazione tipo espressione di new A() è A - che potrebbe essere un riferimento a un'istanza di B, in modo che il getto è consentito.

In fase di esecuzione, tuttavia, il riferimento è solo a un'istanza di A - quindi non riesce il cast. Un'istanza di appena Anon è un'istanza di B. Il cast funziona solo se il riferimento fa realmente riferimento a un'istanza di B o una sottoclasse.

7

B estende A e pertanto B può essere lanciato come A. Tuttavia il contrario non è vero. Un'istanza di A non può essere lanciata come B.

Se vieni dal mondo Javascript, potresti aspettarti che funzioni, ma Java non ha "duck typing".

1

In primo luogo fare in questo modo:

A aClass = new B(); 

Ora fare il vostro fusione esplicita, funzionerà:

B b = (B) aClass; 

fusione esplicito della media deve bisogno di colata implicita. elsewise Il casting esplicito non è permesso.

0

Una volta creato l'oggetto di una classe figlia, non è possibile convertirlo in una super classe. Basta guardare negli esempi di seguito

Presupposti: Dog è la classe bambino che eredita da animali (SuperClass)

Normale Typecast:

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

sbagliato Typecast:

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

Il sotto Typecast funziona davvero:

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

Un compilatore controlla la sintassi è durante la fase di esecuzione i contenuti sono effettivamente verificati