我编写了自己的Stack类(相关代码见下文)。在next()
- 方法中,我被迫将current.item
投射到Item
,但我不知道为什么。 current.item
的类型应该已经是Item
,因此不需要进行投射 - 但如果我不投射,我会收到错误。
public class Stack<Item> implements Iterable<Item> {
private class Node {
Item item;
Node next;
}
private Node first= null;
public Iterator<Item> iterator() { return new StackIterator(); }
private class StackIterator<Item> implements Iterator<Item> {
private Node current = first;
public Item next(){
Item item = (Item)current.item;
current = current.next;
return item;
}
}
}
答案 0 :(得分:7)
您在<Item>
和Stack
上使用StackIterator
作为类型参数,而您真正想做的是StackIterator
没有参数,只是声明它实现了Iterator<Item>
:
private class StackIterator implements Iterator<Item> {
private Node current = first;
@Override
public Item next() {
Item item = current.item; // no need to cast now
current = current.next;
return item;
}
}
答案 1 :(得分:7)
StackIterator<Item>
中的类型参数隐藏了Item
类的定义Stack<Item>
。
这就是你需要进行强制转换(或添加@SuppressWarnings("hiding")
注释)的原因。
要删除警告,只需删除重复的类型:
private class StackIterator implements Iterator<Item> {
}
答案 2 :(得分:3)
您的班级StackIterator
是Stack
的内部班级。这尤其意味着它不是静态。因此,它已经知道类型参数Item
。
你错误地让StackIterator
拥有自己的类型参数Item
。这会影响外部类的类型参数。
因此,只需从StackIterator
中删除type参数:
public class Stack<Item> implements Iterable<Item> {
private class Node {
Item item;
Node next;
}
private Node first = null;
@Override
public Iterator<Item> iterator() { return new StackIterator(); }
private class StackIterator implements Iterator<Item> {
private Node current = Stack.this.first;
@Override
public Item next() {
Item item = this.current.item;
this.current = this.current.next;
return item;
}
}
}
答案 3 :(得分:1)
如果您希望<Item>
中的StackIterator
与<Item>
关联的封闭式Stack
的类型相同,请删除<Item>
中StackIterator
的声明1}}。
如果您希望<Item>
中的StackIterator
与<Item>
相关联的Stack
不同,但您希望能够访问父{的Stack
属性<Item>
{1}},将{{1}}重命名为其他内容。