Дочерний интерфейс указывает на родительский интерфейс, реализующий класс - PullRequest
0 голосов
/ 27 января 2019

Я проверяю один код с точно такой же логикой, но не могу понять, как это происходит.Поэтому, пожалуйста, потерпите меня!:)

class A implements I{}

class B extends A{}

class C extends B{}

interface I{}

interface I2 extends I{}

interface I3 extends I2{}

class Top{

    public static void main(String[] args){

      I3 ob = new A();   //Step I
    }
}

Это невозможно на шаге 1, но я рассматриваю один код, где такая логика происходит без ошибок.Могу ли я узнать, пожалуйста, если это происходит без ошибок, что еще можно посмотреть, чтобы проверить, правильно ли это происходит?Каковы возможности, когда Шаг 1 правильный?

Спасибо

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Я думаю, что это повышение в Java.например, когда вы определяете класс C как расширенный для B и B как расширенный для A, вы можете использовать контейнер A в качестве держателя для объекта C:

class A
class B extends A
class C extends B

, тогда вы можете определить объект изC, как показано ниже:

A a = new C();

Хорошим примером в java является определение ArrayList:

List<E> list = new ArrayList<>();

вы знаете, что определение ArrayList:

class ArrayList implements List { ... }
0 голосов
/ 27 января 2019

См. Мою разработку в комментариях к коду.

class A implements I{}

class B extends A{}

class C extends B{}

interface I{}

interface I2 extends I{}

interface I3 extends I2{}

class Top {

  public static void main(String[] args){

    I ob1 = new A(); // Compiles bcoz A "is an" I
    I2 ob2 = new A(); // Does not compile bcoz A "is not an" I2
    I3 ob3 = new A(); // Does not compile bcoz A "is not an" I3
  }                  
}
0 голосов
/ 27 января 2019

Класс A будет иметь только реализации интерфейса I
Переменная имеет два типа: объявленный (или статический) тип и тип времени выполнения.

I3 ob = new A();

Итак, эта ob переменная объявлена ​​как тип I3, а объект, на который она ссылается, имеет тип A. Это даст вам исключение во время компиляции.И прошу вас привести к I3.Но все равно вы получите исключение времени выполнения 'java.lang.ClassCastException'.

Вы можете назначить ссылку на переменную только ее супертипа .Интерфейс I - это супер тип класса A.Интерфейс I3 не является супертипом класса A.

Если бы у вас было

 class A implements I3{}

, тогда A имел бы всю реализацию I, I2 и I3.Тогда
I3 ob = new A();
было бы возможно.

Возможности, когда Class A реализует I3:

Вы можете использовать ob для вызова методов интерфейса I, I2 и I3.Вы можете проверить, возвращается ли реализация в классе A.

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