位置列表:创建接口实例?

时间:2018-04-05 07:04:48

标签: java list oop

我正在讨论位置列表的实现,我很困惑为什么我们能够将接口的“实例”传递给实现它的类中的某些函数。

对于界面位置:

    public interface Position <E>{
            public Object getElement ();
    }

实现此接口的Node Class

private static class Node<E> implements Position<E> { 
         private E element; // reference to the element stored at this node
         private Node<E> prev; // reference to the previous node in the list
         private Node<E> next; // reference to the subsequent node in the list
         public Node(E e, Node<E> p, Node<E> n) { element = e; prev = p;next = n;}
         //other functions
}

如果我们在一个单独的类中使用Node Class,我看到的函数似乎在一个Postion接口的实例中传递给该函数。例如,函数可能如下所示:

private Node<E> validate(Position<E> p) throws IllegalArgumentException {
    if (!(p instanceof Node)) throw new IllegalArgumentException("Invalid p");
    Node<E> node = (Node<E>) p; // safe cast
    if (node.getNext( ) == null) // convention for defunct node
         throw new IllegalArgumentException("p is no longer in the list");
    return node;
}

另一个例子

public Position<E> before(Position<E> p) throws IllegalArgumentException {  
     Node<E> node = validate(p);
     return position(node.getPrev( ));
 }

当我们将一个接口实例传递给一个函数时,我不确定实际发生了什么。如果我们调用该函数并传入一个Node变量,那么它与接口的具体关系如何? 如上所述,这是我的位置列表教科书的摘录,我似乎无法理解这种抽象是如何工作的。

编辑:

在此函数中,我们将参数设置为节点而不是接口。如果Node仍然实现了Position,那么从函数返回一个Position是什么意思?

    /** Returns the given node as a Position (or null, if it is a sentinel). */
    private Position<E> position(Node<E> node) {

       if (node == header || node == trailer)
       return null; // do not expose user to the sentinels
       return node;
 }

0 个答案:

没有答案