2010-06-13 3 views
0

Пожалуйста, объясните мне ниже ситуации Какой будет выход?Какой будет выход?

 

interface A{} 
class B implements A{} 
class C extends B{} 
class D extends C{} 
class E extends D{ 
public static void main(String args[]){ 
C c = new C(); 
B b = c; 
A a = (E)c; 
a = (B)c; 
c = (C)(B)c; 
} 
} 
 
+3

много ошибок .. – ultrajohn

ответ

4

Будучи полностью строгим, что»не будет компилироваться, так как в строке 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

Я надеюсь, что помогает.

+0

Я уже исправил свои ошибки –

0

Я думаю, что нет выхода. Потому что вы не сказали, где находится точка входа.

Если вы сделал указать главный класс как D E, не будет по-прежнему не выход, так как все эти классы продлить пустой класс.

+0

Основной класс 'E' – OscarRyz

1

ClassCastException при A a = (E) c;

+0

да, но почему? Не могли бы вы объяснить мне это? –

+1

, даже если контейнер «a» имеет тип «A», выполняется кастинг, но он является незаконным, поскольку «c» содержит объект типа C: поскольку E является специализацией C, c нельзя отнести к E. – fede

+0

Поскольку тип объекта «c» равен C. Его нельзя отнести к E. –

1

не попробую, я пойду на конечности и сказать, что эта линия будет вызывать ошибки два компилятора:

C c = (C)(B)c; 
  1. Вы объявляя переменную «C» дважды.
  2. Вы не можете отбрасывать от B до C.

И если вы на самом деле поставить двойной бросок, как это в реальный проект, то вы заслуживаете, чтобы получить вашу задницу.

+0

ОК, я вижу, что вы отредактировали код так, чтобы 1 больше не применялся. И я тоже ошибся. 2. –

+0

Я уже исправил ошибку, объявив переменную c дважды. Благодарю. –

1

Объект c создается как новый C. Поскольку C extends B, это не проблема, назначая его переменной типа B. Однако C ничего не знает о E, поэтому вы не можете использовать здесь. Вы можете сделать это только с помощью суперклассов. Так как A - абсолютный верхний уровень, то можно назначить любые объекты типов, которые вы ему определили.

Смежные вопросы