nbu*_*urk 2 java generics collections iterator iterable
我正在构建我自己的集合类,Iterable用Java 实现接口.但是,我收到编译错误说:
Nikolass-MacBook-Pro:week2 nburk$ javac Deque.java
Deque.java:115: error: incompatible types: Item#1 cannot be converted to Item#2
Item currentItem = current.item;
^
where Item#1,Item#2 are type-variables:
Item#1 extends Object declared in class Deque
Item#2 extends Object declared in class Deque.DequeIterator
1 error
Run Code Online (Sandbox Code Playgroud)
以下是我的代码的相关部分:
public class Deque<Item> implements Iterable<Item> {
// return an iterator over items in order from front to end
public Iterator<Item> iterator() {
return new DequeIterator<Item>();
}
private class DequeIterator<Item> implements Iterator<Item> {
public DequeIterator() {
}
public Item next () {
Item currentItem = current.item; // this line causes the ERROR
current = current.next;
return currentItem;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这个问题有点是因为我以错误的方式使用泛型并且我的声明Item可能不正确.但是,我将我的实现与这个快速教程进行了比较,并没有看到任何可能导致我这方面问题的差异.有什么我缺少的,我怎么能摆脱错误?
在
private class DequeIterator<Item> implements Iterator<Item> {
public DequeIterator() {
}
}
Run Code Online (Sandbox Code Playgroud)
你要声明一个名为的新类型变量Item.你没有重用声明的那个Deque<Item>.这些可能是不同的类型.相反,摆脱参数声明
private class DequeIterator implements Iterator<Item> {
Run Code Online (Sandbox Code Playgroud)
据推测,current.item是对Item声明的类型的对象的引用Deque,但是您试图将它分配给Item声明的类型的变量DequeIterator.
您还需要删除参数化,DequeIterator因为它不再是通用的.所以,例如
return new DequeIterator<Item>();
Run Code Online (Sandbox Code Playgroud)
改变为
return new DequeIterator();
Run Code Online (Sandbox Code Playgroud)