Java 将强制转换添加到同一类型

Java 将强制转换添加到同一类型,java,casting,Java,Casting,我有一个外部类DoublyLinkedList和两个内部类DoublyLinkedNode以及DoublyLinkedListIterator。安排如下: public class DoublyLinkedList<T> extends Collection<T> { private DoublyLinkedNode<T> head; private DoublyLinkedNode<T> tail; public cl

我有一个外部类
DoublyLinkedList
和两个内部类
DoublyLinkedNode
以及
DoublyLinkedListIterator
。安排如下:

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;

    }

}
公共类双链接列表扩展集合{
专用双链接节点头;
私有双链接节点尾;
公共类双链接节点{
私有双链接节点prev;
私有双链接节点next;
T元素;
}
公共类DoublyLinkedListIterator实现ListIterator{
专用双链接节点电流=磁头;
}
}
现在,由于我在stackoverflow和其他来源的多个页面上听到/读到迭代器应该在相应的iterable类中实现,如
DoublyLinkedList
,我认为这会更容易,因为您可以访问外部类字段。现在我想初始化一个
DoublyLinkedListIterator
的实例,但Eclipse在这一点上说:

private DoublyLinkedNode<T> current = head;
专用双链接节点电流=头;
双链接标识符
中:

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

解决此问题的唯一方法是再次使用相同的类型对其进行强制转换:

private DoublyLinkedNode<T> current = (DoublyLinkedNode<T>) head;
专用双链接节点电流=(双链接节点)头;

为什么会这样?

您已经声明了内部类
doublylinkdnode
DoublyLinkdListIterator
。 内部类的作用域中包含了封闭类的所有泛型类型参数,因此
T
已经对它们可用。当您再次声明它们时,您将隐藏封闭类上的
T
。它们是不同的
T
s

删除隐藏外部
T
T
的重新声明(您的类应该实现
集合,它是一个接口),并让您的内部类使用外部
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;
    }
}
公共类DoublyLinkedList实现集合{ 专用双链接节点头; 私有双链接节点尾; 公共类双链接节点{ 私有双链接节点prev; 私有双链接节点next; T元素; } 公共类DoublyLinkedListIterator实现ListIterator{ 专用双链接节点电流=磁头; } }
由于
DoublyLinkedListIterator
实现了
ListIterator
,因此建议让
DoublyLinkedList
集合
的顶部实现
List
。对于如何在该类之外使用
DoublyLinkedListIterator
你有什么建议吗?由于参数类型现在已经消失,一个简单的赋值,如
DoublyLinkedListIterator iterator=someDoublyLinkedList.iterator()next()
方法时,code>仅返回
Object
。在赋值中向类型添加参数无效,在类声明中添加类型参数只会恢复您所做的更改。当您返回迭代器实例时,让该方法返回接口:
iterator
ListIterator
。调用方不需要知道您的实现。您甚至可以将
双链接标识符
设置为私有