无法从内部类访问包含类方法

时间:2014-10-18 15:36:27

标签: java

我正在创建一个实现Iterable的自定义链接列表。我试图从迭代器的remove方法调用我的包含类方法remove方法,但我不能这样做。它说“类型中的方法remove()是不适用于参数(int)“

这是我的代码:

package collections.customCollections.linkedList;

import java.util.Iterator;

public class LinkedList<T> implements Iterable<T>{

private Link<T> head;
private Link<T> tail;
private int size;

public int getSize() {
    return size;
}

public LinkedList(){
    head = null;
    tail = null;
    size=0;
}

public void addAtEnd(T data){   
    Link<T> newNode = new Link<T>(data); 
    //Insert as first element
    if(head == null){
        head = newNode;
        tail = newNode;
    }
    else{
        newNode.previous = tail;
        tail.next = newNode;
        tail = newNode; 
    }
    size++;
}

public void addAtStart(T data){
    Link<T> newNode = new Link<T>(data);
    if(head == null){
        head = newNode;
        tail = newNode;
    }
    else{
        newNode.next = head;
        head.previous = newNode;
        head=newNode;

    }
    size++;
}

//prints the entire linked list
public void print(){
    Link<T> traversalNode = head;
    if(head == null){
        System.out.println("Empty Linked List");
    }
    else{
        while(traversalNode != null){
            System.out.print(traversalNode.data +"->");
            traversalNode=traversalNode.next;
        }
    }
}

public T remove(int index){
    int i=1;
    Link<T> traversalNode = head;
    while(i<index){
        traversalNode=traversalNode.next;
        i++;
    }

    if(traversalNode.next==null){
        removefromEnd();
    }
    else if(traversalNode.previous==null){
        removeFromStart();
    }
    else{
        traversalNode.previous.next=traversalNode.next;
        traversalNode.next.previous=traversalNode.previous;
        traversalNode.next=null;
        traversalNode.previous=null;

    }
    return traversalNode.data;
}

public T removefromEnd(){
    Link<T> nodeToRemove = tail;
    tail = nodeToRemove.previous;
    tail.next = null;
    size--;

    return nodeToRemove.data;
}

public T removeFromStart(){
    Link<T> nodeToRemove = head;
    head = nodeToRemove.next;
    head.previous = null;
    size--;

    return nodeToRemove.data;
}

public T get(int index)
{   Link<T> returnedNode = head;
int i = 1;
while(i < index){
    returnedNode=returnedNode.next;
    i++;
}
return returnedNode.data;
}

private class Link<T>{
    private T data;
    private Link<T> next = null;
    private Link<T> previous = null;

    public Link(T data){
        this.data = data;
    }
}

@Override
public Iterator<T> iterator() {
    return new Iterator<T>(){
        private int position;

        @Override
        public boolean hasNext() {
            if(position<getSize()){
                return true;
            }
            return false;
        }

        @Override
        public T next() {
            T data=get(position);
            position++;
            return data;
        }

        @Override
        public void remove() {
            remove(position);
        }

    };
}
}

编辑:我知道我可以使用LinkedList.this.remove()调用该方法。我更感兴趣的是知道为什么我可以直接调用removefromEnd()并且不能直接调用这个方法?

1 个答案:

答案 0 :(得分:2)

访问外部实例方法的正确语法是:

@Override
public void remove() {
    LinkedList.this.remove(position);
}

编译器 - 虽然 - 为明确的方法提供了一种便捷的方法。这意味着,您必须使用上述语法,因为在匿名类中声明了具有相同名称(remove)的方法。另一方面 - 例如 - 您可以直接在get方法中调用next