Будучи полностью строгим, что»не будет компилироваться, так как в строке 4 вы набираете Class
вместо class
Class D extends C{}
А потом вы определяете дважды a
и 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
Теперь предполагая те были выводами будет ClassCastException
, потому что c
не может быть литой до E
.
При выполнении броска, как вы говорили: «Я программист, и я знаю, что это ...»____(put your class here)
И компилятор позволит скомпилировать.
Но если в выполнения экземпляр не действительно ____ (E
в этом случае, который не является), то он будет бросать ClassCastException
.
Программа не будет работать с A a = (B) c
; потому что c
является экземпляром C
, который является подклассом B
.
Вы можете сказать, что C
является a B
.Для того, чтобы лучше понять его думать о следующем объявлении:
class Employee extends Object {
}
Каждый Employee
являетсяObject
так литая будет успешным, на самом деле это так ясно, что он будет успешным, что вам даже не нужно ставить бросание оператор ()
.
Employee e = new Employee();
Object o = (Object) e; // or much better:
Object o2 = e; // no cast needed when assigning to superclass.
Но не обязательно Object
является Employee
.
Object o = ....
Employee e = (Employee) o; // will fail if o was not created as an Employee.
Вот почему A a = (E) c;
терпят неудачу, потому что, ссылка c
был не создан как E
Я надеюсь, что помогает.
много ошибок .. – ultrajohn