我有以下设计:
我有一个抽象类Instance
,
我有一个Library
课,它扩展了Instance
和
我有一个类File
,它还扩展了Instance
我已经创建了自己的链表实现,其定义如下:
public class List<T extends Instance> implements Iterable {
//some other code here
public Iterator iterator(){
return new ListIterator(this);
}
现在我已经创建了一个类
public class ListIterator<T extends Instance> implements Iterator<T> {
private List thisList;
private Node current;
public ListIterator(List l){
thisList=l;
current=thisList.head.next;
}
@Override
public boolean hasNext() {
if(current==null)
return false;
return false;
}
@Override
public T next() {
Node temp=current;
current=current.next;
return temp.data;
}
}
Node
public class Node<T extends Instance> {
public Node<T> next;
public Node<T> prev;
public T data;
public Node(T data,Node prev, Node next){
this.data=data;
this.prev=prev;
this.next=next;
}
}
所以我的问题如下:行返回temp.data会出现错误:
类型不匹配 - 无法从实例转换为T.
此代码有什么问题?
答案 0 :(得分:4)
我会说Node.data
是对Instance
对象的引用?如果是这种情况,编译器无法自动将Instance
更改为T
,因为即使T
是Instance
对象(T extends Instance
) ,任何给定的Instance
可能不是T
。
Java Generics教程解释了它:http://docs.oracle.com/javase/tutorial/extra/generics/subtype.html
此外,在您的List<T>
课程中,您应该使用Iterator
和ListIterator
将Iterator<T>
和ListIterator<T>
指定为通用,否则编译器会赢得'能够正确处理泛型。您的Node
引用也必须是通用的:Node<T>
因此你应该使用
private Node<T> current;
和
public T next() {
Node<T> temp=current;
current=current.next;
return temp.data;
}
当你使用普通类的原始类型时,编译器通常会警告你。
答案 1 :(得分:1)
没有人注意到这个错误:
public boolean hasNext() {
if(current==null)
return false;
return false;
}
这是一个不变的。除非我遗漏了某些内容,否则迭代器将很快返回0个元素!