Невыносимость в Java - PullRequest
       5

Невыносимость в Java

0 голосов
/ 08 февраля 2020

Предположим, у меня есть следующий код, который выполняется без каких-либо ошибок компиляции / времени выполнения:

B b1 = new A();
B b2 = new C();
A a1 = (C) b2;
D d1 = new C();
B b3 = new B();
D d2 = new A();
D d3 = new B();
E e1 = new E();
D e2 = new E();
B e3 = new E();
C c1 = new C();

Мне нужно выяснить отношения между классами. Насколько я понимаю:

(head) D <- B <- A <- C

У меня есть два вопроса:

  1. Где я могу разместить E? это может быть где-нибудь в B / A / C?

  2. Почему, когда я устанавливаю Object var = new A(); и затем пытаюсь ((C)var).someMethod();, я получаю ошибку времени выполнения, говорящую Class A can not be cast to class C? Исходя из своего опыта, я могу опускаться только до java (правильно?). Если я пытаюсь поменять местами A и C, я получу ошибку компиляции с A a1 = (C) b2;, поэтому я предполагаю, что C должно наследоваться от A?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Редактировать: Включены @ комментарии Sweeper на изображении.

Где разместить E? это может быть где-нибудь в B / A / C?

С кодом, который вы дали, возможна любая из следующих иерархий.

enter image description here

Я получаю ошибку во время выполнения, говоря: Class A can not be cast to class C

Это потому, что вы можете использовать экземпляр дочернего класса для его родительского типа, но не иначе , Таким образом, вы не можете разыграть и экземпляр от A до C. Следующие пункты могут дать понять, почему:

  1. Дочерний класс содержит все структурные части родительского класса, которые protected или более видимы (даже доступ к пакету), но обратное неверно .
  2. По этой причине ссылка на родительский класс может полностью представлять себя при указании на экземпляр дочернего класса. Таким образом, компилятор может разрешить это.
  3. Когда ссылка на дочерний тип указывает на экземпляр родительского класса, тогда некоторые из структурных частей ссылки (child) отсутствуют в родительском, и, следовательно, дочернем классе ссылка не может быть полностью представлена ​​указанным объектом. Следовательно, компилятор не допустит этого.
1 голос
/ 08 февраля 2020
  1. Кажется, что E не является частью дерева наследования (насколько мы можем судить), поскольку нет приведения к нему или из него. Поэтому лично я бы оставил это, но это зависит от определения вопроса, который вы пытаетесь решить.
  2. В вашем случае вы создали экземпляр объекта «А», а затем попытались привести его к объект C - ошибка времени выполнения указывает, что A не является экземпляром C (что означает, что A не наследуется от C).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...