2015-01-03 16 views
5

se:Casting in Java (interfaccia e classe)

interface I{} 

class A implements I{} 

class B extends A{} 

class C extends B{} 

A a = new A(); 
B b = new B(); 

Why a = (B)(I)b; is correct 
but b = (B)(I)a; is false? 

trovo casting per essere molto confusa, qual è il modo migliore per capire se posso verso il basso o verso l'alto getto lanciare un oggetto?

+4

Perché si sta casting a 'I' a tutti? Se togliessi ogni menzione di "I", e avessi semplicemente "a = (B) b;" e "b = (B) a", sarebbe chiaro per te? –

+0

@JonSkeet questa è una domanda d'esame di Java Sono anche molto confuso perché lanciano un'interfaccia "I" – OPK

+0

Entrambe queste conversioni sono corrette (come in entrambe compilano e non falliranno in fase di runtime). Cosa stai vedendo in particolare che li rende non compilabili in Java 7+? – Makoto

risposta

1

la gerarchia di classe si presenta così:

C -> B -> A -> I

oggetto x può essere colato alla classe Y, se il tipo di esecuzione di x è sottoclasse di Y. O, in altre parole, se esiste un percorso dal tipo di runtime di x a Y. Per "tipo di runtime" intendo il tipo di oggetto (quello utilizzato nella costruzione dell'oggetto) in opposizione al tipo di variabile (quello della dichiarazione delle variabili).

Questo è valido:

b = new B(); 
(B)(I)b; 

oggetto memorizzato in b è di tipo B. È castato a I e poi di nuovo a B. B è una sottoclasse di entrambi. Trasmetti su I in realtà non fa nulla ed è pensato solo per confonderti.

Tuttavia, nessuno di questi è valida:

a = new A(); 
(B)(I)a; 
(B)a; 

Essi saranno entrambi esito negativo con eccezione: java.lang.ClassCastException: A cannot be cast to B. a ha il tipo A che non è una sottoclasse di B. C'è una relazione tra A e B, ma è nella direzione opposta - B è una sottoclasse di A.

Per una spiegazione più dettagliata vedere qui: http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

1

L'unica cosa rilevante per risolvere la questione nel campione di codifica è la seguente:

class B extends A{} 

Ciò significa che B è una sottoclasse di A. Le sottoclassi possono essere convertite in tipi di super classe, ma non è possibile eseguire il cast di classe super in tipi di sottoclassi.

Pertanto, A non può essere lanciato al tipo B.

Perché? Pensate la logica in questo modo:

enter image description here è un tipo di Programming_language, ma Programming_language non è un tipo di enter image description here

Problemi correlati