какой будет выход? - PullRequest
0 голосов
/ 13 июня 2010

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


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;
}
}

Ответы [ 5 ]

4 голосов
/ 13 июня 2010

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

Надеюсь, это поможет.

1 голос
/ 13 июня 2010

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

1 голос
/ 13 июня 2010

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

1 голос
/ 13 июня 2010

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

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

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

0 голосов
/ 13 июня 2010

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

Если вы указали , указали основной класс как D E, то все равно не будет никакого вывода, так как всеэти классы расширяют пустой класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...