Когда я создаю объект из класса, который расширяет указанный интерфейс c, могу ли я использовать этот объект там, где я использую этот интерфейс? - PullRequest
1 голос
/ 15 апреля 2020

Я знаю, что могу передать интерфейс в качестве аргумента. Поскольку мы не можем создать объект из интерфейса! Могу ли я создать объект из класса, который расширяет этот интерфейс, тогда я использую этот объект в том месте, где я использую этот интерфейс в качестве аргумента?

Мой вопрос, поскольку obj является объектом из класса Final, могу ли я использовать это как параметр здесь (m1 (obj))? И объясните мне, почему, пожалуйста?

package aaa;

public class AAA {
    public static void m1(One one) {
      System.out.print("AAA");
    }

    public static void main(String[] args) {
      Final obj = new Final();
      m1(obj);
    }
}

interface One {
}

class Final  implements One {
}

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Могу ли я создать объект из класса, расширяющего этот интерфейс

Нет. Только interface может extend другой interface. A class не может extend и interface; это может просто implement и interface. Вы не можете создать объект из interface. Вы можете создать объект только из конкретного class (неабстрактный класс).

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

Вы можете создать объект из class, который implements этого интерфейса, а затем вы можете использовать этот объект в качестве аргумента, который будет передан параметру этого interface тип. Вы уже сделали это в своем коде. Однако обратите внимание, что вы не можете использовать аргумент супертипа для передачи в параметр подтипа, то есть следующий код неверен:

public class AAA {
    public static void m1(Final one) {
        System.out.print("AAA");
    }

    public static void main(String[] args) {
        One obj = new Final();
        m1(obj);
    }
}

Надеюсь, вы уже знаете Что разница между аргументом и параметром?

0 голосов
/ 15 апреля 2020

Да, вы можете сделать это. Интерфейсы - это способ в Java избежать множественного наследования, то есть объявление класса Foo для расширения класса Bar и реализации интерфейса Bar означает, что у нас есть отношение "is" между Foo и Bar / Baz. Итак, «Foo - это Bar», а «Foo - это Baz», или в вашем случае Final - это One. Таким образом, если тип является подтипом (или в Java реализован интерфейс), подтип можно использовать вместо типа или интерфейса (см. Принцип подстановки Лискова).

Когда вы объявляете метод m1(One one), вы требуете, чтобы первый параметр имел тип One, и, поскольку Final является One, это, очевидно, верно.

Обратите внимание, что даже если вы передаете объект типа Final метод только «видит» интерфейсную часть объекта без его приведения.

...