Вопрос об интерфейсе Java - PullRequest
       12

Вопрос об интерфейсе Java

0 голосов
/ 26 января 2010

Мне нужно работать с API, который сопровождается несколькими примерами. В одном из примеров интерфейс используется напрямую для вызова одного из методов этого интерфейса. Однако, поскольку интерфейс не содержит никакой реализации, я хотел бы знать: как методы могут использоваться в примере для достижения чего-либо без определения класса, реализующего этот интерфейс?

Или интерфейс также может содержать полное определение метода? (что, кажется, имеет место здесь)

Ответы [ 6 ]

4 голосов
/ 26 января 2010

Нет, интерфейс содержит только сигнатуры методов. Вы не можете иметь реализацию в интерфейсе.

То, что (наиболее вероятно) происходит в вашем случае, выглядит примерно так (псевдокод):

InterfaceA {
    methodA();
}

class A implements InterfaceA {
   methodA() // implementation
}

InterfaceA getInterface() {
   // some code which returns an object of a class which implements InterfaceA
}

Способ вызова:

InterfaceA in = getInterface() // you might get an instance of class A or any other class which implements InterfaceA

in.methodA(); // implementation from whatever class the method returned
2 голосов
/ 26 января 2010
  • конкретная реализация интерфейса должна существовать. Однако на него ссылается его интерфейс, и поэтому он выглядит как вызов методов на интерфейсе.
  • интерфейсы не могут иметь реализации («полные определения методов»)

Посмотрите, где объект создан. Вы можете иметь:

public void doSomething() {
    MyInterface interface = new MyInterfaceImplementation();
    doSomething(interface);
}

public void doSomethingElse(MyInterface interface) {
    interface.someMethod();
}

Таким образом, глядя на метод doSomethingElse(), может показаться, что у него нет реализации, но тот, кто вызвал метод, предоставил реализацию (в данном случае MyInterfaceImplementation);

2 голосов
/ 26 января 2010

Ты имеешь в виду что-то подобное ...

InterfaceA a = getInterface();
a.method();

В этом случае a будет экземпляром класса, который реализует InterfaceA - то, что этот класс не имеет значения, так как все, что вас волнует, это методы интерфейса.

1 голос
/ 26 января 2010

Вы можете говорить о двух вещах:

public static void sort(List list, Comparator c){ ... }

Здесь параметр list имеет тип интерфейса List, но любой, кто вызывает метод, должен будет передать экземпляр конкретного класса, например ArrayList, который реализует интерфейс, и код метода будет называть методы этого конкретного класса - этот механизм называется «диспетчеризация динамического метода» и лежит в основе основного принципа полиморфизма ОО.

sort(myList, new Comparator(){
    public int compare(Object o1, Object o2){
        ...
    }
});

Это пример анонимного класса : код фактически определяет новый класс без имени, который реализует интерфейс Comparator, и в то же время создает экземпляр этого класса. Это используется в Java главным образом для вещей, где другие языки будут использовать языковые конструкции, такие как указатели на функции, замыкания или обратные вызовы: для передачи фрагмента кода, который будет выполнен внутри вызываемого вами метода.

1 голос
/ 26 января 2010

Возможно, вы имеете в виду что-то вроде этого:

    (new Runnable(){
        public void run() {
            System.out.println("I'm running already!");
        }
    }).run();

Если это так, он называется анонимным внутренним классом .

1 голос
/ 26 января 2010

Интерфейс просто определяет контракт. У вас должна быть реализация, чтобы делать реальные вещи.

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

Или, может быть, API использует Внедрение зависимостей для обеспечения реализации, но вы просто видите, как используется код.

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