interface作为Java中的方法参数

zih*_*oyu 46 java oop interface

几天前我接受了采访,并抛出了这样的问题.

问:反转链表.以下代码给出:

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为我不知道接口对象可以用作方法参数.面试官解释了一下,但我仍然不确定.有人可以开导我吗?

Mic*_*rdt 59

这实际上是使用界面最常用和最有用的方法之一.接口定义了一个契约,你的代码可以与任何实现接口的类一起工作,而不必知道具体的类 - 它甚至可以用于编写代码时尚不存在的类.

Java标准API中有许多示例,尤其是在集合框架中.例如,Collections.sort()可以排序任何实现的List接口(不只是ArrayList或者LinkedList,虽然实现自己的List不常见),其内容实现Comparable接口(不只是String或数值包装类-和拥有自己的类实现Comparable为目的常见).


Ben*_*tto 27

它不是传递给方法的接口"对象",仍然只是一个常规对象.这只是一种说法"此参数将接受支持此接口的任何对象".它等同于接受基类类型的某个对象,即使您传入的是子类.

  • 太好了,有帮助!!:D (3认同)

ahe*_*ahe 8

这称为接口编程.您不需要编写特定的节点列表实现类,而是编写所有这些实现实现的接口.

这样,如果有人NodeList在您编写了反向方法之后编写了一个新的更好的实现,并且您不必为每个新实现调整代码,那么您的代码仍然可以工作NodeList.


Pin*_*juh 6

参数需要一个对象,该类实现一个接口(参数).

Java中代码:

void reverse(NodeList node) {
    // your code
}
Run Code Online (Sandbox Code Playgroud)

等于:

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

注意; 在此处阅读有关接口的更多信息:http://java.sun.com/docs/books/tutorial/java/IandI/interfaceAsType.html

  • <pedant>*参数*是接口类型,*参数*是对象</ pedant> (8认同)
  • 并且真的很可爱.参数是对象的引用:} (3认同)