la gerarchia di classe si presenta così:
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
fonte
2015-01-03 21:59:33
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? –
@JonSkeet questa è una domanda d'esame di Java Sono anche molto confuso perché lanciano un'interfaccia "I" – OPK
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