взаимодействуйте через интерфейс как параметр метода в Java

Я имел интервью несколько дней назад и был брошен вопрос как это.

Q: Инвертируйте связанный список. Следующий код дан:

public class ReverseList { 
    interface NodeList {
        int getItem();
        NodeList nextNode();
    }
    void reverse(NodeList node) {

    }
    public static void main(String[] args) {

    }
}

Я был смущен, потому что я не знал, что интерфейсный объект мог использоваться в качестве параметра метода. Интервьюер объяснил немного, но я все еще не уверен в этом. Кто-то мог просветить меня?

46
задан nIcE cOw 26 September 2017 в 01:14
поделиться

4 ответа

Фактически, это один из наиболее распространенных и полезных способов использования интерфейса. Интерфейс определяет контракт, и ваш код может работать с любым классом, реализующим интерфейс, без необходимости знать конкретный класс - он может даже работать с классами, которые еще не существовали на момент написания кода.

В стандартном API Java есть много примеров, особенно в структуре коллекций. Например, Collections.sort () может сортировать все, что реализует интерфейс List (не только ArrayList или LinkedList ], хотя и реализует ваш собственный Список встречается нечасто) и содержимое которого реализует интерфейс Comparable (не только String или числовые классы-оболочки - и наличие собственного класса реализации Comparable) для этой цели довольно часто ).

59
ответ дан 26 November 2019 в 20:17
поделиться

Это называется программированием интерфейсов. Вы кодируете не конкретный класс реализации списков узлов, а интерфейс, реализованный всеми этими реализациями.

Таким образом, ваш код по-прежнему будет работать, если кто-то напишет новую и гораздо лучшую реализацию NodeList после того, как вы написали свой обратный метод, и вам не придется адаптировать свой код для каждой новой реализации ] NodeList .

8
ответ дан 26 November 2019 в 20:17
поделиться

Это не интерфейс " объект ", передаваемый в метод, по-прежнему является обычным объектом. Это просто способ сказать «этот параметр будет принимать любой объект, поддерживающий этот интерфейс». Это эквивалентно принятию некоторого объекта типа базового класса, даже если вы переходите в подкласс.

27
ответ дан 26 November 2019 в 20:17
поделиться

Аргументу нужен объект, класс которого реализует интерфейс (параметр).

В псевдо Java код:

void reverse(NodeList node) {
    // your code
}

равен:

reverse(x) {
    if(x == null || x instanceof NodeList) {
         // your code
    }else throw new RuntimeException("Some sort of error.");
}

Примечание; подробнее об интерфейсах читайте здесь: http://java.sun.com/docs/books/tutorial/java/IandI/interfaceAsType.html

6
ответ дан 26 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: