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.DoublyLinkedNodeprivate 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
。调用方不需要知道您的实现。您甚至可以将双链接标识符
设置为私有
。