Я имел интервью несколько дней назад и был брошен вопрос как это.
Q: Инвертируйте связанный список. Следующий код дан:
public class ReverseList {
interface NodeList {
int getItem();
NodeList nextNode();
}
void reverse(NodeList node) {
}
public static void main(String[] args) {
}
}
Я был смущен, потому что я не знал, что интерфейсный объект мог использоваться в качестве параметра метода. Интервьюер объяснил немного, но я все еще не уверен в этом. Кто-то мог просветить меня?
Фактически, это один из наиболее распространенных и полезных способов использования интерфейса. Интерфейс определяет контракт, и ваш код может работать с любым классом, реализующим интерфейс, без необходимости знать конкретный класс - он может даже работать с классами, которые еще не существовали на момент написания кода.
В стандартном API Java есть много примеров, особенно в структуре коллекций. Например, Collections.sort () может сортировать все, что реализует интерфейс List
(не только ArrayList
или LinkedList
], хотя и реализует ваш собственный Список
встречается нечасто) и содержимое которого реализует интерфейс Comparable
(не только String
или числовые классы-оболочки - и наличие собственного класса реализации Comparable)
для этой цели довольно часто ).
Это называется программированием интерфейсов. Вы кодируете не конкретный класс реализации списков узлов, а интерфейс, реализованный всеми этими реализациями.
Таким образом, ваш код по-прежнему будет работать, если кто-то напишет новую и гораздо лучшую реализацию NodeList
после того, как вы написали свой обратный метод, и вам не придется адаптировать свой код для каждой новой реализации ] NodeList
.
Это не интерфейс " объект ", передаваемый в метод, по-прежнему является обычным объектом. Это просто способ сказать «этот параметр будет принимать любой объект, поддерживающий этот интерфейс». Это эквивалентно принятию некоторого объекта типа базового класса, даже если вы переходите в подкласс.
Аргументу нужен объект, класс которого реализует интерфейс (параметр).
В псевдо 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