添加转换为相同类型

CRo*_*eld 3 java casting

我有一个外类DoublyLinkedList<T>和两个内部类DoublyLinkedNode<T>以及DoublyLinkedListIterator<T>.它们的安排如下:

public class DoublyLinkedList<T> extends Collection<T> {

    private DoublyLinkedNode<T> head;
    private DoublyLinkedNode<T> tail;

    public class DoublyLinkedNode<T> {

        private DoublyLinkedNode<T> prev;
        private DoublyLinkedNode<T> next;
        T element;

    }

    public class DoublyLinkedListIterator<T> implements ListIterator<T> {

        private DoublyLinkedNode<T> current = head;

    }

}
Run Code Online (Sandbox Code Playgroud)

现在,因为我在stackoverflow和其他来源的多个页面上听到/读取Iterator应该在相应的可迭代类中实现DoublyLinkedList<T>,我认为这样会更容易,因为您可以访问外部类字段.现在我想初始化一个实例DoublyLinkedListIterator<T>,但Eclipse在这一点上说:

private DoublyLinkedNode<T> current = head;
Run Code Online (Sandbox Code Playgroud)

在里面DoublyLinkedListIterator<T>:

类型不匹配:无法从DoublyLinkedList.DoublyLinkedNode <T>转换为DoublyLinkedList.DoublyLinkedNode <T>

解决这个问题的唯一方法是再次使用相同的类型:

private DoublyLinkedNode<T> current = (DoublyLinkedNode<T>) head;
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

rge*_*man 11

你已经宣布了内部类DoublyLinkedNodeDoublyLinkdListIterator.内部类在范围内具有封闭类的所有泛型类型参数,因此T它们已经可用.再次声明它们时,您将隐藏T在封闭类上.他们是不同T的.

删除T隐藏外部的重新声明T(您的类应该实现Collection,这是一个接口),并让您的内部类使用外部T:

public class DoublyLinkedList<T> implements Collection<T> {

    private DoublyLinkedNode head;
    private DoublyLinkedNode tail;

    public class DoublyLinkedNode {
        private DoublyLinkedNode prev;
        private DoublyLinkedNode next;
        T element;
    }

    public class DoublyLinkedListIterator implements ListIterator<T> {
        private DoublyLinkedNode current = head;
    }
}
Run Code Online (Sandbox Code Playgroud)