Неявный интерфейс, приведение классов в JAVA - PullRequest
0 голосов
/ 04 декабря 2018

Я учусь на сертификат JAVA Programmer I, и среди вопросов есть один, который я не могу понять:

//Given:

interface I{}
class A implements I{}
class B extends A {}
class C extends B{}

//and

A a = new A();
B b = new B();

Определение параметров, которые будут скомпилированы и запущены без ошибок.

A. a = (B)(I)b;
B. b = (B)(I)a;
C. a = (I)b;
D. I i = (C)a;

Теперь я знаю, что ответ А), но я не понимаю, если класс В является потомком класса А, тогда «а» может быть равен «б» без приведения, почему ответ Б)неправильно?Что означает даже литье (B) (I)?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018
  1. Родительская ссылка может использоваться для хранения дочерних объектов.Таким образом, ниже все верно.

    A a = new A();
    B b = new B();
    I i = new A();
    a = new B();
    b = new C();
    
  2. Ниже предпринята попытка привести объект к подклассу, экземпляром которого он не является. Таким образом, ниже будет выброшен CCE.

    b = (B)(I)a;
    c = (C)(I)a;
    

    Вы можете проверить так же, как System.out.println(a instanceof C);

0 голосов
/ 04 декабря 2018

B расширяет A. Таким образом, вы можете разыгрывать экземпляры B в A, но не наоборот.Код скомпилируется, но выдает исключение ClassCastException во время выполнения.

Попытка привести к классу-потомку называется понижением.В данном случае приведение к «I» позволяет компилировать этот код, но в результате возникает исключение ClassCastException.

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