être complètement stricte, ce ne compilera pas parce que la ligne 4 vous tapez Class
au lieu de class
Class D extends C{}
Et plus tard vous définissez deux fois a
et c
C c = new C(); // once
B b = c;
A a = (E)c; // once a
A a = (B)c; // twice c
C c = (C)(B)c; // twice
Maintenant, en supposant ce étaient fautes de frappe la sortie serait ClassCastException
car c
ne peut pas être cast à E
.
Lorsque vous effectuez un casting est comme vous disiez: « Je suis le programmeur et je sais que c'est ... »____(put your class here)
Et le compilateur vous permettra compilez.
Mais si exécution l'instance est pas vraiment un ____ (un E
dans ce cas, ce qui est pas) alors il jette ClassCastException
.
Le programme n'échouera pas avec A a = (B) c
; car c
est une instance de C
qui est une sous-classe de B
.
Vous pouvez dire que, C
est un B
.Pour comprendre mieux penser à la déclaration suivante:
class Employee extends Object {
}
Chaque Employee
est unObject
donc le casting réussira, est en fait tellement clair qu'il réussira que vous ne même pas besoin de mettre le casting opérateur ()
.
Employee e = new Employee();
Object o = (Object) e; // or much better:
Object o2 = e; // no cast needed when assigning to superclass.
Mais pas nécessairement un Object
est un Employee
.
Object o = ....
Employee e = (Employee) o; // will fail if o was not created as an Employee.
Voilà pourquoi A a = (E) c;
échouent, parce que, la référence c
était pas créé comme un E
J'espère que cela aide.
beaucoup d'erreurs .. – ultrajohn